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中
如何将带有输入"yyyyMMddHHmmss"的时间字符串转换为"America / Sao_Paulo"时区中带有DST输出的时间字符串?
您只是在一个时区打印它,在该时区不是夏令时 - 打印
例如,将
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 |
Ideone demo
java.time
您正在使用麻烦的旧日期时间类,现在由java.time类取代。
您的输入缺少任何来自UTC或时区信息的偏移。所以我们解析为
1 2 3 | String input ="20161016052355"; DateTimeFormatter f = DateTimeFormatter.ofPattern("uuuuMMddHHmmss" ) ; LocalDateTime ldt = LocalDateTime.parse( input , f ); |
ldt.toString(): 2016-10-16T05:23:55
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相同的时刻,请提取
1 | Instant instant = zdt.toInstant() ; |
instant.toString(): 2016-10-16T07:23:55Z
请参阅IdeOne.com上的此代码。
关于java.time
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧遗留日期时间类,例如
现在处于维护模式的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的试验场。您可以在这里找到一些有用的类,例如
这对我有用
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)
BLOCKQUOTE>
请检查一下......
请替换您的特定时间
string dts ="2010年5月16日上午7:20:12 CDT";
DateTime dt =
DateTime.ParseExact(dts.Replace("CDT"," - 05:00"),"yyyyMMddHHmmss",null);