我想将提供的日期和时间中的时区作为字符串,并将其转换为本地时区datetime。 我的简单日期格式为
“ EEE yyyy-MM-dd'at'hh:mm:ss aa zzz”
据此,来自客户的日期为
太平洋标准时间2018年8月2日星期四上午07:10:19
现在,我想将PST用作时区,并以本地时区转换日期和时间(例如IST)
我正在使用JAVA8。
答案 0 :(得分:1)
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.util.Date
对象?从那个可怕的旧的过时的类转换为它的现代替代品java.time.Instant
。
Instant instant = myJavaUtilDate.toInstant() ;
应用时区(ZoneId
)以获得ZonedDateTime
。
以continent/region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用3-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance 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中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 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));