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

Arr*_*han 2 java datetime epoch java-date

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

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = new Date();
sdf.setTimeZone(TimeZone.getTimeZone("GMT-7"));
String value = sdf.format(date);
System.out.println(value);
Date date2 = sdf.parse(value);
long result = date2.getTime();
System.out.println(result);
return result;
Run Code Online (Sandbox Code Playgroud)

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

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

Ole*_*.V. 5

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

但是,请注意:如果您知道如何获得自纪元以来的毫秒数,则很简单:

    long millisecondsSinceEpoch = System.currentTimeMillis();
    System.out.println(millisecondsSinceEpoch);
Run Code Online (Sandbox Code Playgroud)

刚刚打印:

1533458641714

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

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

    long secondsSinceEpoch = Instant.now().getEpochSecond();
    System.out.println(secondsSinceEpoch);
Run Code Online (Sandbox Code Playgroud)

1533458641

你说:

我只需要获取格林尼治标准时间所在的当前时间…

再次相信你的话:

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

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

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

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

1533458641000

您的代码有一些问题,但是:

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

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


Mad*_*yil 4

为什么不使用Calendar类?

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

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

基于哈拉尔德的评论:

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

  • 现在你不应该真正使用“日历”,它有很多特性,并会导致你严重搞砸。而是看看新的“java.time”包。 (6认同)
  • “Calendar”和“TimeZone”类早已过时,尽管“Calendar”试图解决“Date”的一些问题,但事实证明它的设计很糟糕。我推荐使用 [java.time,现代 Java 日期和时间 API,](https://docs.oracle.com/javase/tutorial/datetime/)。 (2认同)
  • 为什么不使用“Calendar”类?因为它是一个糟糕的类,设计也很糟糕,多年前就被 *java.time* 类取代了。具体来说,“ZonedDateTime”。 (2认同)