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中使用的纪元格式即可。
有人可以告诉我这种格式,并且上面的代码正确吗?
首先,您不应将自纪元以来的时间作为时间戳存储在数据库中。查看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)
Run Code Online (Sandbox Code Playgroud)2018-08-05T08:44:01.719265Z 1533458641719
我知道GMT和UTC并不完全相同,但是对于大多数应用程序,它们可以(并且)可以互换使用。
有人可以告诉我(如果)上述代码正确吗?
当我现在运行您的代码时,它的输出与我的一致,除了毫秒被舍入为整整数千秒(整秒):
1533458641000
您的代码有一些问题,但是:
SimpleDateFormat, Date和TimeZone。特别是第一个以麻烦而闻名。相反,我们应该使用java.time,现代的Java日期和时间API。hh,一天中的小时使用小写字母。hh是从1点到12点在AM或PM内的一个小时,因此至少在一天的一半时间内会给您错误的结果。大写HH是一天中的小时。GMT-7用作时区。使用例如America/Los_Angeles。当然,请选择适合您情况的时区。Date为字符串并解析回字符串时,我看不到任何意义。即使您正确地执行了操作,唯一的结果就是丢失毫秒,因为格式没有毫秒(它只有秒精度;这也解释了我观察到的四舍五入)。链接: Oracle教程:Date Time解释了如何使用java.time,现代的Java日期和时间API。
为什么不使用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)
| 归档时间: |
|
| 查看次数: |
1600 次 |
| 最近记录: |