我正在尝试使用 Joda 在一个简单的 Java 程序中获取 UTC 时间戳:
public Timestamp getCurrentUTC(LocalDateTime date, DateTimeZone srcTZ, DateTimeZone dstTZ, Locale l) {
DateTime srcDateTime = date.toDateTime(srcTZ);
DateTime dstDateTime = srcDateTime.toDateTime(dstTZ);
System.out.println("UTC Time:" + dstDateTime.getMillis());
System.out.println("UTC Time:" + new Timestamp(dstDateTime.getMillis()));
return new Timestamp(dstDateTime.getMillis());
}
程序的输出如下:
UTC Time:1378265162047
UTC Time:2013-09-03 23:26:02.047
毫秒值是正确的 UTC 时间(即用GMT-4
时区确认) 第二个值是EST
时区。
我需要的是 UTC 值不变java.sql.Timestamp
(即独立于 TZ),用于数据库写入。这可能吗?
编辑 1
DateTime srcDateTime = date.toDateTime(srcTZ);
DateTime dstDateTime = srcDateTime.toDateTime(dstTZ);
System.out.println("UTC Time:" + dstDateTime.getMillis());
我知道这srcDateTime
是本地日期 (GMT-4),并且dstDateTime
是 UTC (GMT-0)。日期的输出值如下:
Source Date:2013-09-04T09:10:43.683-04:00
Destination Date: 2013-09-04T13:10:43.683Z
我尝试了所有组合以尝试将 UTC 值dstDateTime
作为 java.sql.TimeStamp 获取:
System.out.println("UTC Time:" + dstDateTime.getMillis());
System.out.println("UTC Time:" + new Timestamp(srcDateTime.toDateTime(DateTimeZone.UTC).getMillis()));
System.out.println("UTC Time:" + new Timestamp(dstDateTime.toDateTime(DateTimeZone.UTC).getMillis()));
用于测试的打印输出:
UTC Time:1378298760226 - Correct UTC
UTC Time:2013-09-04 08:46:00.226 - Incorrect Local Date Time instead of the Expected UTC
UTC Time:2013-09-04 08:46:00.226 - Incorrect Local Date Time instead of the Expected UTC
第一个打印行是正确的 UTC 时间戳。我只需要与 java.sql.TimeStamp 类型相同的值。我尝试过的任何东西总是返回机器的本地日期时间。
编辑 2
我尝试了以下方法:
System.out.println("UTC Timestamp:" + date.toDateTime(srcTZ).getMillis());
System.out.println("UTC Timestamp:" + new Timestamp(date.toDateTime(srcTZ).getMillis()));
输出如下:
UTC Time:1378342856315 - Correct UTC Time
UTC Timestap:2013-09-04 21:00:56.315 - Local Time other than the expected UTC Time
每当我尝试转换为时间戳时,我都会丢失我所追求的有效 UTC 值。
在方法的参数方面:
srcTZ = DateTimeZone.forTimeZone(TimeZone.getTimeZone("America/Montreal")
dstTZ = DateTimeZone.forTimeZone(TimeZone.getTimeZone("Etc/UTC"))
Local l = new Locale("en", "CA")
任何帮助是极大的赞赏。
缺口。
编辑 3
你好,马特,
非常感谢你的回复。我们得到和你一样的结果。不知道关于打印等的事情。更具体地说:
System.out.println("UTC Timestamp:" + srcDateTime.toDateTime(dstTZ).getMillis());
System.out.println("UTC Timestamp:" + srcDateTime.toDateTime(dstTZ));
System.out.println("UTC Timestamp:" + new Timestamp(srcDateTime.toDateTime(dstTZ).getMillis()));
产生输出:
UTC Timestamp:1378389098468 - Correct UTC Timestap (Thu, 05 Sep 2013 13:51:38 GMT)
UTC Timestamp:2013-09-05T13:51:38.468Z - Correct UTC Time
UTC Timestamp:2013-09-05 09:51:38.468 - Local time is printed, UTC is expected
当我们意识到数据库存储的是本地时间而不是 UTC 时,这个问题引起了我的注意:
+---------------------+
| effectivedate |
+---------------------+
| 2013-09-05 09:34:11 |
+---------------------+
Mysql 时区设置为“-00:00”
mysql> SELECT CURRENT_TIMESTAMP;
+---------------------+
| CURRENT_TIMESTAMP |
+---------------------+
| 2013-09-05 13:48:09 |
+---------------------+
使用 eclipse 调试器调试应用程序,我们意识到本地日期时间 (2013-09-05 09:51:38.468) 正在传递给数据库(无法发布图像,没有足够的点......)。数据类型是直接时间戳,没有字符串操作。也许eclipse调试器String.println()
也在使用函数,不确定..
我非常感谢调试我们的应用程序的所有帮助。不想占用这么多时间(没有双关语)和精力......
亲切的问候,
缺口。