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

Convert Time Zone from a String to a particular Time Zone taking DST into consideration of target Time Zone

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

我正在使用TimeZone类

TimeZone represents a time zone offset, and also figures out daylight
savings.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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输出的时间字符串?


您只是在一个时区打印它,在该时区不是夏令时 - 打印Date将其打印在JVM的默认时区。

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

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

打印:

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

Ideone demo


java.time

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

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

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

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

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

1
2
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

1
Instant instant = zdt.toInstant() ;

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

请参阅IdeOne.com上的此代码。

关于java.time

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

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。

从哪里获取java.time类?

  • Java SE 8,Java SE 9及更高版本

    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小功能和修复。
  • Java SE 6和Java SE 7

    • 许多java.time功能都被反向移植到Java 6& 7在ThreeTen-Backport。
  • Android的

    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport(如上所述)。
    • 请参见如何使用ThreeTenABP ....

ThreeTen-Extra项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuarter等。


这对我有用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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){

}

Input : 20161015113634 (Time which is not in DST)

Output: 20161015030634 (Converted time for SaoPaulo)

输入:20161016113634(夏时制)

Output: 20161016040634 (Converted time for SaoPaulo with DST Offset)


请检查一下......

请替换您的特定时间

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