如何使用 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 数据库中使用的纪元格式。
谁能告诉我那个格式,上面的代码对吗?
为什么不用Calendar
class?
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
列。 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
你说:
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
不过您的代码有一些问题:
您使用的是旧的、过时的且设计不佳的 类 SimpleDateFormat
、Date
和 TimeZone
。尤其是第一个以麻烦着称。相反,我们应该使用 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
格式化为字符串并将其解析回来毫无意义。即使你做对了,你得到的唯一结果就是失去你的毫秒数,因为你的格式中没有毫秒数(它只有秒精度;这也解释了我观察到的四舍五入)。
链接
- Oracle tutorial: Date Time 解释如何使用
java.time
,现代 Java 日期和时间 API。
- San Jose, California on Wikipedia
我写了下面的代码 运行,并给出了输出。但我不确定这是正确的。
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 数据库中使用的纪元格式。
谁能告诉我那个格式,上面的代码对吗?
为什么不用Calendar
class?
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
列。 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
你说:
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
不过您的代码有一些问题:
您使用的是旧的、过时的且设计不佳的 类
SimpleDateFormat
、Date
和TimeZone
。尤其是第一个以麻烦着称。相反,我们应该使用 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
格式化为字符串并将其解析回来毫无意义。即使你做对了,你得到的唯一结果就是失去你的毫秒数,因为你的格式中没有毫秒数(它只有秒精度;这也解释了我观察到的四舍五入)。
链接
- Oracle tutorial: Date Time 解释如何使用
java.time
,现代 Java 日期和时间 API。 - San Jose, California on Wikipedia