我在下面编写了正在运行的代码,并提供输出。但是我不确定这是对的。
undefined
上面的代码是我想要的,我只需要获取GMT时区的当前时间并将其转换为将在Oracle数据库中使用的纪元格式即可。
有人可以告诉我这种格式,并且上面的代码正确吗?
答案 0 :(得分:4)
首先,您不应将自纪元以来的时间作为时间戳存储在数据库中。查看DMBS提供的日期时间数据类型。在Oracle中,我认为date
列可以。对于大多数其他DBMS,您将需要一个datetime
列。根据您的确切要求,timestamp
和timestamp 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
您的代码有一些问题,
SimpleDateFormat
,Date
和TimeZone
。特别是第一个以麻烦而闻名。相反,我们应该使用现代的Java日期和时间API java.time。hh
。 hh
在上午或下午的1到12点之间是一个小时,因此至少在一天的一半时间内会给您带来不正确的结果。大写HH
是一天中的某个小时。GMT-7
作为时区。例如使用America/Los_Angeles
。当然,请选择适合您情况的时区。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;
}