将时区从字符串转换为特定时区,将DST考虑到目标时区

时间:2016-04-14 07:33:35

标签: java date datetime timezone

我正在尝试转换格式为" yyyyMMddHHmmss"的日期字符串。到另一个时区的日期字符串" America / Sao_Paulo"将DST考虑在美国/ Sao_Paulo(2016年10月16日开始)。

我正在使用TimeZone类作为

  

TimeZone表示时区偏移,也表示日光   节省。

import java.util.TimeZone;
import java.text.*;
import java.util.Date;;

public class TimeZoneConversion {

    public static void main(String[] args) 
    {

            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");     
            sdf.setTimeZone(TimeZone.getTimeZone("America/Sao_Paulo"));
            try

            {   
                String inputdate = "20161016052355";
                Date t = sdf.parse(inputdate);  
                System.out.println(t);
            }
            catch(ParseException e)
            {

            }    
    }
}

上述输出显示在IST

Sun Oct 16 12:53:55 IST 2016

如何使用输入转换时间字符串" yyyyMMddHHmmss"在" America / Sao_Paulo"中的时间字符串输出中带有DST的时区?

4 个答案:

答案 0 :(得分:1)

您只是在该日期不是夏令时的时区打印 - 打印Date将其打印在JVM的默认时区。

例如,将System.out.println(t)替换为:

SimpleDateFormat out = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss zzzz");
out.setTimeZone(TimeZone.getTimeZone("America/Sao_Paulo"));
System.out.println(out.format(t));

打印:

2016/10/16 05:23:55 Brasilia Summer Time

Ideone demo

答案 1 :(得分:0)

请检查......

请替换您的特定时间

string dts =" 2010年5月16日上午7:20:12 CDT&#34 ;; DateTime dt =     DateTime.ParseExact(dts.Replace(" CDT"," -05:00")," yyyyMMddHHmmss",null);

答案 2 :(得分:0)

这对我有用

try
{
SimpleDateFormat f = new SimpleDateFormat("yyyyMMddhhmmss");
f.setTimeZone(TimeZone.getTimeZone("Asia/Calcutta"));
Date time = f.parse("20161015113634");  


DateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");  
formatter.setTimeZone(TimeZone.getTimeZone("America/Sao_Paulo"));

System.out.println(formatter.format(time)); 
}
catch (ParseException e){

} 
  

输入:20161015113634(不在夏令时的时间)

     
    

输出:20161015030634(SaoPaulo的转换时间)

  
     

输入:20161016113634(夏令时间)

     
    

输出:20161016040634(圣保罗转换时间与DST偏移量)

  

答案 3 :(得分:0)

java.time

你正在使用麻烦的旧日期时间类,现在由java.time类取代。

您的输入缺少任何来自UTC或时区信息的偏移。所以我们解析为LocalDateTime,意思是任何位置。

String input = "20161016052355";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuuMMddHHmmss" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f );
  

ldt.toString():2016-10-16T05:23:55

LocalDateTime 片刻,时间轴上的某个点。为了给它真正的意义,你必须提供预期的时区(或偏移)。

ZoneId z = ZoneId.of( "America/Sao_Paulo" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;
  

zdt.toString():2016-10-16T05:23:55-02:00 [America / Sao_Paulo]

要查看与UTC相同的时刻,请提取Instant

Instant instant = zdt.toInstant() ;
  

instant.toString():2016-10-16T07:23:55Z

请参阅此code run live at IdeOne.com

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore