【问题标题】:Working with UTC time in Java and .net?在 Java 和 .net 中使用 UTC 时间?
【发布时间】:2015-12-23 17:42:56
【问题描述】:

在我的应用程序中,我正在从一个文件中读取一个字符串值,该文件表示 UTC 格式的时间,由 .net 2015 生成。在我的 Java 应用程序中,我读取了这个值并需要将其转换为首先是一个 long 值,然后将其转换回 UTC 时间。这是我在 Java 中将时间转换为长值的代码:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'");
df.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = df.parse(timeString);
long timeLong = date.getTime();

并将其转换回 UTC 格式:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'");
df.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = new Date(timeLong);               
newTimeStamp = df.format(date);

但是,我得到的最终 UTC 时间与我从文件中读取的原始时间不同。它几乎有两个小时的差异。我想知道是不是因为Java和.Net中时间转换的实现方式不同。

我最初的时间是2015-12-22T21:00:11.8701036Z,我做这个转换后得到的最后时间是2015-12-22T23:25:12.000036Z

附言我使用的是 Java 1.7。

【问题讨论】:

  • 我已将您标记为 stackoverflow.com/questions/18122608/… 的副本 - 我发现当我执行您的代码时,我已经离开了 8 小时(我离开 UTC 的小时数)。我想你是在 UTC +/- 2?
  • Date 类的主要缺陷之一是它本质上不支持时区,除非您从 Calendar 实例创建它。这也是 Java 8 有一个新的 Date API 的部分原因,包括 ZonedDateTime 类。
  • 我想你毕竟没有重复 - 我正在写一个答案解释
  • @soong:你有解决办法吗?

标签: java datetime utc


【解决方案1】:

SimpleDateFormat 中的 S 模式表示毫秒,而不是小数毫秒。因此,8701036 被解析为8701036 毫秒,这使总日期(或时间戳)增加了 8701 秒。这相当于您所看到的额外的 2 小时 25 分 1 秒。

SimpleDateFormat 不适用于毫秒的小数部分。据我所知,您必须自己解析它们。

【讨论】:

  • 我该如何解析?
  • @H.Z.取8701036 并做一些数学运算来解决它对应的每秒毫秒数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
  • 2019-08-15
  • 2015-11-25
  • 2016-04-01
  • 1970-01-01
相关资源
最近更新 更多