关于java:Epoch_time_convertion_issue

Epoch_time_convertion_issue

我的服务器正在使用GMT时区,但我的应用程序正在处理IST,所以我在保存到数据库时将GMT转换为IST。但是,当我将保存的IST转换为epoch time时,它将在保存的IST时间中添加5小时30分钟。

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

将GMT转换为IST的代码:

1
2
3
4
5
6
7
8
 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)转换为epoch time的代码。我在此方法中传递的日期是2018-01-24 15:51:01,因此此方法应返回此日期的epoch time,但在此时间中添加5小时30分钟。

1
2
3
4
public static long getEpochDateTime(Date date) {
        long epochDateTime = date.getTime();
        return epochDateTime;
    }


DR

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

1
Instant.now().toEpochMilli()

或:

1
myDate.toInstant().toEpochMilli()

细节

正如已经讨论过多次的那样,堆栈溢出…

My server is using GMT time zone

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

converting GMT to IST while saving to database

你的大部分工作都是在UTC完成的。只有在业务逻辑如此指示或向用户展示时,才调整到另一个时区。

DateFormat converter = new SimpleDateFormat("dd-MM-yyyy:HH:mm:ss");

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

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

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

1
ZoneId z = ZoneId.of("Asia/Kolkata" ) ;

以UTC格式获取当前时刻。

1
Instant instant = Instant.now() ;

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

1
Instant instant = myJavaUtilDate.toInstant() ;

通过调用toString生成一个字符串,用标准的iso 8601格式表示这个时刻。

1
String output = instant.toString() ;

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

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

调用toString生成一个字符串,该字符串的格式通过在方括号中追加时区名称来明智地扩展iso 8601格式。

1
String output = zdt.toString() ;

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

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

1
Instant instant = zdt.toInstant() ;

returns the epoch time

把时间作为历元的计数来跟踪是不好的做法。但是如果你坚持,你可以从1970年的第一个时刻提取毫秒数。当心数据丢失,因为Instant的分辨率为纳秒。

1
long millis = instant.toEpochMilli() ;

再拿一个Instant。我再次建议您不要使用来自epoch的计数,但如果您坚持的话。

1
Instant instant = Instant.ofEpochMilli( millis ) ;

关于JavaTimes

JavaTimeFr框架是在Java 8和之后构建的。这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的joda time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程。以及搜索堆栈溢出以获得许多示例和解释。规格为JSR 310。

在哪里获取java.time类?

  • Java SE 8、Java SE 9及以后
    • 内置的。
    • 标准JAVA API的一部分与捆绑实现。
    • Java 9添加了一些小的特性和修复。
  • Java SE 6和Java SE 7
    • 大部分JavaTimeActudio都被移植到TealEnter后端的Java 6和7中。
  • 安卓
    • java.time类的Android包实现的更高版本。
    • 对于早期的android,threetenabp项目适应threeten backport(如上所述)。看看如何使用三连珠……

threeten额外项目使用额外的类扩展java.time。这个项目是将来可能添加到java.time的一个试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等等。


在序列化日期时,您可能应该包括时区。新建simpledateformat("yyyy-mm-dd't'hh:mm:ss'z'");