将任何时区的日期和时间转换为UTC时区

12
  • 这是我的日期 "15-05-2014 00:00:00"。

  • 如何将 IST 转换为 UTC,即(到14-05-2014 18:30:00)。

  • 基于从时区到 UTC 时区。

我的代码如下:

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)。

  • 请提出任何建议。


1
无论是IST还是EST,当您打印时,它将始终处于本地时区。所以您的任务只与打印有关,还是您想进一步使用该值? - vikeng21
感谢回复,不同时区的用户输入了起始和结束日期,我想要将这些日期值转换并用于进一步的计算,但我没有打印出这些值。 - user3599212
1
可能是将日期字符串(EST)转换为Java日期(UTC)的重复问题。 - Basil Bourque
1
请注意,像java.util.Datejava.util.Calendarjava.text.SimpleDateFormat这样的旧日期时间类现在已经成为遗留系统,被内置于Java 8及更高版本中的java.time类所取代。请参阅Oracle的教程 - Basil Bourque
2个回答

17

您无法将日期值转换为其他时区或UTC。类型java.util.Date没有任何内部时区状态,并且根据规范仅以一种用户无法更改的方式引用UTC(仅计算自UNIX纪元以来在UTC时区中的毫秒数,不考虑闰秒)。

但是,您可以将java.util.Date的格式化字符串表现形式转换为另一个时区。我喜欢使用两个不同的格式化程序,每个时区一个(和模式)。我还建议在您的情况下使用"Asia/Kolkata",因为这样它将普遍适用(IST也可能是"Israel Standard Time",在以色列会被解释为不同的意思):

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

14

简而言之

LocalDateTime.parse( 
    "15-05-2014 00:00:00" , 
    DateTimeFormatter.ofPattern( "dd-MM-uuuu HH:mm:ss" ) 
)
.atZone( ZoneId.of( "Asia/Kolkata" ) )
.toInstant()

java.time

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[Asia/Kolkata]

为了通过UTC的挂钟时间提取相同时刻和时间线上的相同点,请提取一个{{Instant}}。

Instant instant = zdt.toInstant() ;

instant.toString(): {{2014年5月14日18点30分00秒Z}}

关于 java.time

java.time 框架内置于 Java 8 及更高版本。这些类替代了老旧的 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在处于 maintenance mode,建议迁移到 java.time 类。

要了解更多信息,请参阅 Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规范是 JSR 310

使用符合JDBC 4.2或更高版本的JDBC驱动程序,您可以直接与数据库交换java.time对象。无需使用字符串或java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目扩展了java.time库,提供了额外的类。该项目是java.time可能未来新增内容的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuarter以及more


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接