如何使用 java 查找 GMT 的纪元格式当前时间

How to find epoch format current time of GMT using java

我写了下面的代码 运行,并给出了输出。但我不确定这是正确的。

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;

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

谁能告诉我那个格式,上面的代码对吗?

为什么不用Calendarclass?

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

它将 return 当前日期的 Epoch/Unix 时间戳。

根据 Harald 的评论:

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

这是一个使用 java.time API

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

首先,您不应将纪元以来的时间作为时间戳存储在数据库中。查看您的 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

你说:

I just need to get the current time of GMT time zone…

再次相信你的话:

    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 并不完全相同,但对于大多数应用程序,它们可以(并且正在)互换使用。

Can someone tell me (if) the above code is right?

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

1533458641000

不过您的代码有一些问题:

  • 您使用的是旧的、过时的且设计不佳的 类 SimpleDateFormatDateTimeZone。尤其是第一个以麻烦着称。相反,我们应该使用 java.time,现代 Java 日期和时间 API.

  • 错误:在您的格式模式字符串中,您使用小写 hh 表示一天中的小时。 hh 是上午或下午的一个小时,从 1 点到 12 点,因此至少有半天的时间会给您不正确的结果。大写 HH 表示一天中的小时数。

  • 不要使用 GMT-7 作为时区。使用例如 America/Los_Angeles。当然 select 对您的情况有意义的时区。编辑:你说:

    I just want to specify the timezone for sanjose. GMT-7 is refer to sanjose current time.

    我相信很多地方都叫圣何塞。如果您指的是美国加利福尼亚州圣何塞,您将修改您的程序以在每次加利福尼亚回到标准时间并在夏令时 (DST) 开始时使用 GMT-8?悲惨的想法。使用 America/Los_Angeles,您的程序将全年运行。

  • 既然你问的是 GMT 时区的时间,那你用 GMT-7 干什么?

  • 我认为将您的 Date 格式化为字符串并将其解析回来毫无意义。即使你做对了,你得到的唯一结果就是失去你的毫秒数,因为你的格式中没有毫秒数(它只有秒精度;这也解释了我观察到的四舍五入)。

链接