如何使用Java查找GMT的时代格式当前时间

时间:2018-08-01 18:45:19

标签: java datetime epoch java-date

我在下面编写了正在运行的代码,并提供输出。但是我不确定这是对的。

undefined

上面的代码是我想要的,我只需要获取GMT时区的当前时间并将其转换为将在Oracle数据库中使用的纪元格式即可。

有人可以告诉我这种格式,并且上面的代码正确吗?

3 个答案:

答案 0 :(得分:4)

首先,您不应将自纪元以来的时间作为时间戳存储在数据库中。查看DMBS提供的日期时间数据类型。在Oracle中,我认为date列可以。对于大多数其他DBMS,您将需要一个datetime列。根据您的确切要求,timestamptimestamp with timezone可能是其他甚至更合理的选择。

但是,请相信:知道纪元后自毫秒起的毫秒数很简单:

    long millisecondsSinceEpoch = System.currentTimeMillis();
    System.out.println(millisecondsSinceEpoch);

这只是打印出来的:

  

1533458641714

纪元是在UTC中定义的,因此在这种情况下,我们无需担心其他时区。

如果您需要秒而不是毫秒,那么很容易将其除以1000。但是,进行自己的时间转换是一个坏习惯,因为这些库已经提供了转换,并且使用适当的库方法可以提供更清晰,更多解释和更少错误的信息容易产生的代码:

    long secondsSinceEpoch = Instant.now().getEpochSecond();
    System.out.println(secondsSinceEpoch);
  

1533458641

您说:

  

我只需要获取GMT时区的当前时间...

再说一次:

    OffsetDateTime currentTimeInUtc = OffsetDateTime.now(ZoneOffset.UTC);
    System.out.println(currentTimeInUtc);
    long millisecondsSinceEpoch = currentTimeInUtc.toInstant().toEpochMilli();
    System.out.println(millisecondsSinceEpoch);
2018-08-05T08:44:01.719265Z
1533458641719

我知道GMT和UTC并不完全相同,但是对于大多数应用程序,它们可以(并且)可以互换使用。

  

有人可以告诉我(如果)上面的代码正确吗?

当我现在运行您的代码时,它的输出与我的一致,除了毫秒数被四舍五入到整千(整秒):

  

1533458641000

您的代码有一些问题,

  • 您正在使用旧的,过期时间长且设计不良的类SimpleDateFormatDateTimeZone。特别是第一个以麻烦而闻名。相反,我们应该使用现代的Java日期和时间API java.time。
  • 错误:在您的格式模式字符串中,一天中的小时使用小写的hhhh在上午或下午的1到12点之间是一个小时,因此至少在一天的一半时间内会给您带来不正确的结果。大写HH是一天中的某个小时。
  • 请勿使用GMT-7作为时区。例如使用America/Los_Angeles。当然,请选择适合您情况的时区。
  • 既然您在GMT时区询问时间,那么您到底要使用GMT-7吗?
  • Date格式化为字符串并解析回字符串没有任何意义。即使您正确地执行了操作,但唯一的结果就是丢失了毫秒,因为格式没有毫秒(它只有秒精度;这也解释了我观察到的四舍五入)。

链接: Oracle tutorial: Date Time解释了如何使用现代Java日期和时间API java.time

答案 1 :(得分:1)

这是使用java.time API

的解决方案
ZonedDateTime zdt = LocalDateTime.now().atZone(ZoneId.of("GMT-7"));
long millis = zdt.toInstant().toEpochMilli();

答案 2 :(得分:0)

为什么不使用Calendar类?

public long getEpochTime(){
    return Calendar.getInstance(TimeZone.getTimeZone("GMT-7")).getTime().getTime()/1000; //(  milliseconds to seconds)
}

它将返回当前日期的时代/ Unix时间戳。

基于Harald的评论:

 public static long getEpochTime(){
    return Clock.system(TimeZone.getTimeZone("GMT-7").toZoneId() ).millis()/1000;
}