我正在尝试使用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),用于数据库写入。这可能吗?
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
我尝试了所有组合,试图将dstDateTime
的UTC值作为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类型相同的值。
我尝试了以下方法:
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")
非常感谢任何帮助。
刻痕
你好马特,
非常感谢您的回复。我们得到的结果与您相同。不知道关于印刷等的事情。更具体地说:
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
当我们意识到DB存储的是本地时间而不是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()
函数,不确定。
我非常感谢调试应用程序的所有帮助。不想占用那么多时间(没有双关语)和精力......
亲切问候,
刻痕
我为此挣扎了几个小时,终于找到了解决方案。
我正在使用PlayFramework-不确定这是否会对任何人有所帮助,但对于我的数据库连接设置,我必须使用:
db.default.url="jdbc:mysql://localhost/continuum?characterEncoding=UTF-8&serverTimezone=UTC"
(添加“
试试这个简短的程序,它应该说明发生了什么:
LocalDateTime date = LocalDateTime.now();
DateTimeZone tz = DateTimeZone.getDefault();
System.out.println(date);
System.out.println(tz);
System.out.println("-----");
System.out.println(date.toDateTime(tz));
System.out.println(date.toDateTime(tz).toInstant());
System.out.println(date.toDateTime(tz).toDateTime(DateTimeZone.UTC));
System.out.println("-----");
System.out.println(date.toDateTime(tz).getMillis());
System.out.println(date.toDateTime(tz).toInstant().getMillis());
System.out.println(date.toDateTime(tz).toDateTime(DateTimeZone.UTC).getMillis());
System.out.println("-----");
System.out.println(new Timestamp(date.toDateTime(tz).getMillis()));
System.out.println(new Timestamp(date.toDateTime(tz).toInstant().getMillis()));
System.out.println(new Timestamp(date.toDateTime(tz).toDateTime(DateTimeZone.UTC).getMillis()));
在我的电脑上,它输出:
2013-09-04T19:08:35.111
America/Phoenix
-----
2013-09-04T19:08:35.111-07:00
2013-09-05T02:08:35.111Z
2013-09-05T02:08:35.111Z
-----
1378346915111
1378346915111
1378346915111
-----
2013-09-04 19:08:35.111
2013-09-04 19:08:35.111
2013-09-04 19:08:35.111
如您所见,您可以使用. toInstant()
或. toDateTime(DateTimeZone.UTC)
来获取UTC时间。但是即使您调用这两个都不是,当您调用getMillis()
时,您仍然会获得UTC值。
所以问题不在于JodaTime。问题在于您如何评估结果。
创建 java.sql.Timestamp
时,您将传入从 1/1/1970 UTC 开始的毫秒数。只有当您显示它时,它才会将本地时区应用于结果。
假设您将它作为Timestamp
传递给数据库,而不做一些中间字符串表示,那么您应该没事。只是因为当您调用<code>System.out时,它看起来像本地时间。println,并不意味着它是内部的本地时间。
java.sql.Timestamp
类扩展了 java.util.Date
- 这是它获得此行为的地方。
我希望这能让某人省去3天的废话。在代码中的逻辑位置设置默认时区。使事情变得更加可移植,而不必设置环境变量等。您可以通过在代码、构造函数等的逻辑位置添加以下内容来做到这一点:
DateTimeZone.set默认(DateTimeZone.UTC);
您可以打印UTC,连接UTC任何东西…
但是,当我在数据库中查找时,存储的时间是由数据库时区与UTC的差值得出的。例如,当我的数据库在UTC+1运行时,运行上面的代码保存“08:00z”,数据库中的时间戳显示为09:00。 datetime的getMillis方法说“从1970-01-01t00:00:00z的Java纪元获取datetime瞬间的毫秒。”MySql的时间戳显示:“MySql将时间戳值从当前时区转换为UTC以存储,然后从
我有带有时间戳(UTC时间)的json日志。我将键和值映射到Cassandra表键并插入记录。但是,Cassandra通过从时间戳中减去5小时,再次将已有的UTC时间戳转换为UTC。这里的时区是(GMT+5)。 现在时间已经是UTC时间,并且仍然插入5小时前的时间戳。 我如何解决这个问题?
我选择“无时区”是因为我知道我的应用程序使用的所有时间戳总是UTC。就我得到的文档而言,“with timestamp”的唯一区别是,我可以提供其他时区的值,然后将其转换为UTC。然而,我想避免这样的自动转换,因为如果我知道我的值是UTC,它们几乎没有任何好处。 当我在测试表中添加新记录并使用pgAdmin查看表的内容时,我可以看到插入日期已正确地保存为UTC格式。 但是,当我尝试使用JDBC选择
问题内容: 我有一个毫秒本地本地时间戳,我想将其转换为毫秒本地UTC时间戳。快速浏览一下文档,看起来像这样工作: 有一个更好的方法吗? 问题答案: 使用a 来获取本地纪元处的偏移量,然后将其添加到本地纪元时间戳中。
我知道有人问过这个问题,但没有提供解决方案。Python UTC日期时间对象的ISO格式不包括Z(Zulu或零偏移) 我正在寻找一种在Python中用这种格式生成UTC时间戳的干净方法。我需要的格式是。 具体来说,我需要在最后加上“Z”。Python的不会在末尾附加Z。 请注意,手动添加“Z”不是我可以接受的解决方案。我正在寻找一个干净的方法来做到这一点。 以ISO格式生成带后缀的UTC时间戳的干
问题内容: 我正在寻找将UTC时间字符串转换为Unix时间戳的选项。 我拥有的字符串变量是,需要将其转换为unix时间戳,例如 任何想法如何做到这一点? 问题答案: 首先,unix时间戳没有时间,但以UTC为单位。 在包有功能解析与预计解析时的布局。布局是从参考时间开始构造的。因此,在您的情况下,布局应为。使用Parse之后,您将获得一个可以调用Unix来接收Unix时间戳的结构。