如何从Java中给定的datetime字符串获取时区?

时间:2018-08-06 14:17:22

标签: java date datetime java-8 timezone

我想将提供的日期和时间中的时区作为字符串,并将其转换为本地时区datetime。 我的简单日期格式为

  

“ EEE yyyy-MM-dd'at'hh:mm:ss aa zzz”

据此,来自客户的日期为

  

太平洋标准时间2018年8月2日星期四上午07:10:19

现在,我想将PST用作时区,并以本地时区转换日期和时间(例如IST)

我正在使用JAVA8。

2 个答案:

答案 0 :(得分:1)

tl; dr

myJavaUtilDate                     // Some `java.util.Date` object. This troublesome class is obsolete.
.toInstant()                       // Convert from terrible legacy class to modern *java.time* class. Both represent a moment in UTC, always UTC.
.atZone(                           // Adjust from `Instant` in UTC to a `ZonedDateTime` in the wall-clock time used by the people of a particular region (a time zone).
    ZoneId.of( "Asia/Kolkata" )    // Specify time zone with `Continent/Region` name, never 3-4 letter pseudo-zone.
)                                  // Returns a `ZonedDateTime` object.
.toString()                        // Generate a String in standard ISO 8601 format extended to append name of zone.

java.time

那么您手中有一个java.util.Date对象?从那个可怕的旧的过时的类转换为它的现代替代品java.time.Instant

Instant instant = myJavaUtilDate.toInstant() ;

应用时区(ZoneId)以获得ZonedDateTime

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用3-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;  
ZonedDateTime zdt = instant.atZone( z ) ;

要生成一个字符串,它是标准的ISO 8601格式,明智地扩展为将时区的名称附加在方括号中,请调用toString

String output = zdt.toString() ;  // Standard ISO 8601 format, extended by appending name of zone.

对于其他格式,search Stack Overflow for DateTimeFormatter class。已经讨论了很多次了。


关于 java.time

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

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

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

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

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:0)

您可以这样设置日期格式:

Date date = new Date();

DateFormat formatter = new SimpleDateFormat("dd MM yyyy HH:mm:ss z");
formatter.setTimeZone(TimeZone.getTimeZone("IST"));
System.out.println(formatter.format(date));