这是我约会的时间" 15-05-2014 00:00:00"
如何将IST转换为UTC,即(至14-05-2014 18:30:00)
我的代码是
DateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss");
formatter.setTimeZone(TimeZone.getTimeZone("IST")); //here set timezone
System.out.println(formatter.format(date));
formatter.setTimeZone(TimeZone.getTimeZone("UTC")); //static UTC timezone
System.out.println(formatter.format(date));
String str = formatter.format(date);
Date date1 = formatter.parse(str);
System.out.println(date1.toString());
如果用户从任何区域输入相同的日期,那么将获得UTC时间(例如:从澳大利亚然后15-05-2014 00:00:00到14-05-2014 16:00:00)
请提出任何建议。
答案 0 :(得分:11)
您无法"转换日期值"到其他时区或UTC。类型java.util.Date
没有任何内部时区状态,只能按用户无法更改的方式引用UTC(仅计算自UTC时代以来的毫秒数)暂时离开leapseconds)。
但是你可以将java.util.Date
的格式化字符串表示转换为另一个时区。我更喜欢使用两种不同的格式化程序,每个时区(和模式)一个。我也更喜欢使用" Asia / Kolkata"在你的情况下,因为它将普遍起作用(IST也可以是"以色列标准时间"在以色列将有不同的解释):
DateFormat formatterIST = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
formatterIST.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata")); // better than using IST
Date date = formatterIST.parse("15-05-2014 00:00:00");
System.out.println(formatterIST.format(date)); // output: 15-05-2014 00:00:00
DateFormat formatterUTC = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
formatterUTC.setTimeZone(TimeZone.getTimeZone("UTC")); // UTC timezone
System.out.println(formatterUTC.format(date)); // output: 14-05-2014 18:30:00
// output in system timezone using pattern "EEE MMM dd HH:mm:ss zzz yyyy"
System.out.println(date.toString()); // output in my timezone: Wed May 14 20:30:00 CEST 2014
答案 1 :(得分:5)
LocalDateTime.parse(
"15-05-2014 00:00:00" ,
DateTimeFormatter.ofPattern( "dd-MM-uuuu HH:mm:ss" )
)
.atZone( ZoneId.of( "Asia/Kolkata" ) )
.toInstant()
Answer by Meno Hochschild是正确的,但显示现在过时的类。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu HH:mm:ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( "15-05-2014 00:00:00" , f ) ;
ldt.toString():2014-05-15T00:00
显然你确定字符串代表了印度时刻的一个时刻。提示:您应该在该字符串中包含区域或偏移量。更好的是,使用标准的ISO 8601格式。
指定印度时区。
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;
zdt.toString():2014-05-15T00:00 + 05:30 [亚洲/加尔各答]
要查看同一时刻,时间轴上的同一点,通过UTC的挂钟时间,提取Instant
。
Instant instant = zdt.toInstant() ;
instant.toString():2014-05-14T18:30:00Z
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
如果JDBC driver符合JDBC 4.2或更高版本,您可以直接与数据库交换 java.time 对象。不需要字符串或java.sql。* classes。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。