如何从日历中获取UTC时间戳?

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)

Jon*_*eet 16

当你打电话时Calendar.getTime(),这将为你提供一个没有相关时区的值 - 或者你可以认为它是以UTC为单位 - 在日历所代表的瞬间.因此,如果它(比如说)在日历的时区上午9点,则可能是UTC时间下午5点.

现在java.util.Date(我想Timestamp)将在您调用时(无论是隐式还是显式)在系统默认时区中进行格式化toString() - 但不要让那个让您误以为时区是对象本身内部数据的一部分.

你需要了解很清楚究竟你想达到什么-然后你可能会发现,约达时间可以让你表达的代码更明显比内置库做.


Mic*_*rdt 11

您的代码已经完全按照您的意愿执行.Timestamp(以及Date)没有时区信息,并且应始终包含GMT时间戳(Calendar.getTimeInMillis()返回的是什么).

您看到本地时间打印的原因是DateFormat工厂方法以及Timestamp.toString()隐式使用系统时区.


Bas*_*que 5

太长了;博士

\n\n
Instant.now() \n
Run Code Online (Sandbox Code Playgroud)\n\n

避免遗留日期时间类

\n\n

您正在使用麻烦的旧日期时间类,现在已被 java.time 类取代。无需使用DateFormatCalendarTimestamp

\n\n

如果您必须与Calendar尚未更新到 java.time 的旧代码进行交互,请使用添加到旧类的新方法进行转换。提取一个过时的java.util.Date,并转换为Instant.

\n\n
Instant instant = myCal.getTime().toInstant() ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用java.time

\n\n

获取当前时刻作为Instant. 该类表示UTCInstant时间线上的时刻,分辨率为纳秒(最多九 (9) 位小数)。

\n\n
Instant instant = Instant.now() ;\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

2017-02-17T03:29:15.725Z

\n
\n\n

数据库

\n\n

使用 JDBC 4.2 及更高版本,您可以直接Instant与数据库交换对象。所以不需要过时的java.sql.Timestamp

\n\n
myPreparedStatement.setObject( \xe2\x80\xa6 , instant ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

和检索:

\n\n
Instant instant = myResultSet.getObject( \xe2\x80\xa6 , Instant.class ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

从纪元开始计数

\n\n

显然,您需要自纪元参考日期以来的毫秒数1970-01-01T00:00:00Z。您可以从 中提取该数字Instant。但要小心数据丢失,因为 aInstant的分辨率为纳秒,您将其截断为毫秒。

\n\n
long millis = instant.toEpochMilli() ;\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

1487302155725

\n
\n\n
\n\n

关于 java.time

\n\n

java.time框架内置于 Java 8 及更高版本中这些类取代了麻烦的旧遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

\n\n

Joda -Time项目现在处于维护模式,建议迁移到java.time类。

\n\n

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

\n\n

从哪里获取 java.time 类?

\n\n\n\n

ThreeTen -Extra项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如Interval、、、等等。YearWeekYearQuarter

\n