Jon*_*nas 13 java timezone timestamp calendar localization
在Java中,当我使用时,Calendar.getInstance();
我获得了Calendar
当前时区的对象.但java.sql.Timestamp
通常存储在UTC时间而不是当地时间.那么如何从Calendar实例获取UTC时间?
DateFormat df = DateFormat.getTimeInstance();
Calendar cal = Calendar.getInstance();
Timestamp time = new Timestamp(cal.getTimeInMillis());
// Prints local time
System.out.println(df.format(new Date(time.getTime())));
// Printe local time, but I want UTT Time
System.out.println("timestamp: " + time);
Run Code Online (Sandbox Code Playgroud)
Mic*_*rdt 11
您的代码已经完全按照您的意愿执行.Timestamp
(以及Date
)没有时区信息,并且应始终包含GMT时间戳(Calendar.getTimeInMillis()
返回的是什么).
您看到本地时间打印的原因是DateFormat
工厂方法以及Timestamp.toString()
隐式使用系统时区.
Instant.now() \n
Run Code Online (Sandbox Code Playgroud)\n\n您正在使用麻烦的旧日期时间类,现在已被 java.time 类取代。无需使用DateFormat
、Calendar
或Timestamp
。
如果您必须与Calendar
尚未更新到 java.time 的旧代码进行交互,请使用添加到旧类的新方法进行转换。提取一个过时的java.util.Date
,并转换为Instant
.
Instant instant = myCal.getTime().toInstant() ;\n
Run Code Online (Sandbox Code Playgroud)\n\n获取当前时刻作为Instant
. 该类表示UTCInstant
时间线上的时刻,分辨率为纳秒(最多九 (9) 位小数)。
Instant instant = Instant.now() ;\n
Run Code Online (Sandbox Code Playgroud)\n\n\n\n\n2017-02-17T03:29:15.725Z
\n
使用 JDBC 4.2 及更高版本,您可以直接Instant
与数据库交换对象。所以不需要过时的java.sql.Timestamp
。
myPreparedStatement.setObject( \xe2\x80\xa6 , instant ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n和检索:
\n\nInstant instant = myResultSet.getObject( \xe2\x80\xa6 , Instant.class ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n显然,您需要自纪元参考日期以来的毫秒数1970-01-01T00:00:00Z
。您可以从 中提取该数字Instant
。但要小心数据丢失,因为 aInstant
的分辨率为纳秒,您将其截断为毫秒。
long millis = instant.toEpochMilli() ;\n
Run Code Online (Sandbox Code Playgroud)\n\n\n\n\n1487302155725
\n
java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧遗留日期时间类,例如java.util.Date
, Calendar
, & SimpleDateFormat
。
Joda -Time项目现在处于维护模式,建议迁移到java.time类。
\n\n要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
\n\n从哪里获取 java.time 类?
\n\nThreeTen -Extra项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如Interval
、、、等等。YearWeek
YearQuarter