Epoch_time_conversion_issue

Posted

技术标签:

【中文标题】Epoch_time_conversion_issue【英文标题】:Epoch_time_convertion_issue 【发布时间】:2018-07-03 02:51:44 【问题描述】:

我的服务器正在使用 GMT 时区,但我的应用程序正在使用 IST,所以我在保存到数据库的同时将 GMT 转换为 IST。但是当我将此保存的 IST 转换为纪元时间时,它会增加 5 小时 30 分钟到节省了 IST 时间。

你知道为什么吗?我做错什么了吗?

GMT转IST代码:

 public static Date convertGmtToIst(Date date) throws ParseException 
        DateFormat converter = new SimpleDateFormat("dd-MM-yyyy:HH:mm:ss");
        converter.setTimeZone(TimeZone.getTimeZone("IST"));
        String dateReturns = converter.format(date);
        SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy:HH:mm:ss");
        Date alteredDate = formatter.parse(dateReturns);
        return alteredDate;
    

这是我用来将 IST(2018-01-24 15:51:01) 转换为纪元时间的代码。我在此方法中传递的日期是 2018-01-24 15:51:01 所以这个方法应该返回这个日期的纪元时间,但它在这个时间上增加了 5 小时 30 分钟。

public static long getEpochDateTime(Date date) 
        long epochDateTime = date.getTime();
        return epochDateTime;
    

【问题讨论】:

能否提供您用于从 GMT 转换为 IST 以及反之亦然的代码? @Prashant public static Date convertGmtToIst(Date date) throws ParseException DateFormat converter = new SimpleDateFormat("dd-MM-yyyy:HH:mm:ss");转换器.setTimeZone(TimeZone.getTimeZone("IST")); String dateReturns = converter.format(date); SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy:HH:mm:ss");日期更改日期 = formatter.parse(dateReturns);返回更改日期; 发帖前搜索 Stack Overflow。这已经被报道过很多次了。提示:java.time.Instant. 我不明白为什么在 2018 年你还在尝试使用早已过时的 SimpleDateFormat 类和同样过时的朋友 Datejava.time, the modern Java date and time API, 使用起来更好。 如果我们有机会在这种情况下为您提供帮助,您必须包括您看过的答案(至少几个示例),并准确解释它们是如何不足或失败的来解决你的问题。否则我们只能用我们的精力重复那些无用的答案中所说的话,而不是为了任何人的利益。 【参考方案1】:

tl;博士

使用智能对象,而不是哑字符串。

Instant.now().toEpochMilli()

或者:

myDate.toInstant().toEpochMilli()

详情

正如在 Stack Overflow 上多次讨论过的......

我的服务器使用的是 GMT 时区

永远不要依赖服务器操作系统的时区设置。始终指定传递给 java.time 类的方法的可选时区参数。

在保存到数据库时将 GMT 转换为 IST

您的大部分工作都使用 UTC。仅当业务逻辑要求或向用户展示时才调整到另一个时区。

日期格式转换器 = new SimpleDateFormat("dd-MM-yyyy:HH:mm:ss");

使用日期时间对象,而不仅仅是字符串。

永远不要使用麻烦的DateCalendar 类。现在被 java.time 类所取代。

切勿使用 3-4 个字符的伪时区代码,例如 IST。它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。使用大陆/地区格式的真实时区。

ZoneId z = ZoneId.of( “Asia/Kolkata” ) ;

以 UTC 获取当前时刻。

Instant instant = Instant.now() ; 

如果您的代码必须与 Date 互操作,请在旧类上使用新方法来回转换。

Instant instant = myJavaUtilDate.toInstant() ;

通过调用toString,以标准 ISO 8601 格式生成一个字符串来表示这一刻。

String output = instant.toString() ;

调整到另一个时区。同一时刻,时间轴上的同一点,不同的挂钟时间。

ZonedDateTime zdt = Instant.atZone( z ) ;  // Same moment, different wall-clock time.

调用toString 生成一个字符串,该字符串的格式通过将时区名称附加在方括号中,巧妙地扩展了 ISO 8601 格式。

String output = zdt.toString() ;

要生成其他格式的字符串,请参阅DateTimeFormatter 类。

您可以通过提取Instant 从分区时刻移动到 UTC。

Instant instant = zdt.toInstant() ;

返回纪元时间

将跟踪时间作为从 epoch 开始计数是不好的做法。但是,如果您坚持,您可以从 UTC 的 1970 年第一刻开始提取毫秒数。小心数据丢失,Instant 的分辨率为纳秒级。

long millis = instant.toEpochMilli() ;

再次获取Instant。同样,我建议反对使用从时代开始计数,但如果你坚持的话。

Instant instant = Instant.ofEpochMilli( millis ) ;

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

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

从哪里获得 java.time 类?

Java SE 8Java SE 9 及更高版本 内置。 标准 Java API 的一部分,带有捆绑实现。 Java 9 添加了一些小功能和修复。 Java SE 6Java SE 7 ThreeTen-Backport 中的大部分 java.time 功能都向后移植到 Java 6 和 7。 Android java.time 类的 android 捆绑包实现的更高版本。 对于早期的 Android,ThreeTenABP 项目采用 ThreeTen-Backport(如上所述)。见How to use ThreeTenABP…

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuarter 和more。

【讨论】:

【参考方案2】:

您可能应该在序列化日期时包含时区。 new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");

【讨论】:

以上是关于Epoch_time_conversion_issue的主要内容,如果未能解决你的问题,请参考以下文章