Get current time of day in seconds
有没有办法在几秒钟内获得当天的当前时间? 注意我问的是当天的时间,而不是UTC时间。
我想要的是0到86,400(12:00 AM - 11:59 PM)之间的值(以秒为单位)。 我正在开发一个每天工作的应用程序,当这一天结束时,时间(以秒为单位)应该再次重新开始
所以我们说它是
PS:我不知道手头的时间。 该程序将使用
使用Java 8,您可以创建
例如 :
1 2 | LocalDateTime date = LocalDateTime.now(); long seconds = Duration.between(date.withSecond(0).withMinute(0).withHour(0), date).getSeconds(); |
或者更简单地说,您可以将
1 2 | LocalDateTime date = LocalDateTime.now(); int seconds = date.toLocalTime().toSecondOfDay(); |
来自
1 | public int toSecondOfDay() |
Extracts the time as seconds of day, from 0 to 24 * 60 * 60 - 1.
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // 10:00 AM LocalTime d = LocalTime.of(10, 0); System.out.println(d.get(ChronoField.SECOND_OF_DAY)); // 36000 // 05:00 PM d = LocalTime.of(17, 0); System.out.println(d.get(ChronoField.SECOND_OF_DAY)); // 61200 // 23:59:59 d = LocalTime.of(23, 59, 59); System.out.println(d.get(ChronoField.SECOND_OF_DAY)); // 86399 // midnight d = LocalTime.of(0, 0); System.out.println(d.get(ChronoField.SECOND_OF_DAY)); // 0 |
这打印:
36000
61200
86399
0
笔记:
-
这只是一个例子。如果你想从当前时间获得值,只需使用
LocalTime.now() (或@Ole V.V.答案中指出的LocalTime.now(ZoneId.of("timezone-name")) )。作为
timezone-name ,始终使用IANA时区名称(始终采用Continent/City 格式,如America/Sao_Paulo 或Europe/Berlin )。
避免使用3个字母的缩写(如CST 或PST ),因为它们不明确且不标准。您可以通过调用ZoneId.getAvailableZoneIds() 获取可用时区列表(并选择最适合您系统的时区)。 -
如果需要,也可以调用
d.toSecondOfDay() (它等效,因为get(ChronoField) 内部调用toSecondOfDay )。
我建议:
1 | int secondsOfDay = LocalTime.now(ZoneId.of("Europe/Rome")).toSecondOfDay(); |
注意事项:
-
使用明确的时区来提醒读者和您自己,时区的选择很重要,并且您已经做出了有意识的选择。要么
ZoneId.systemDefault() ,要么更好的是,如果在你的情况下给出一个像ZoneId.of("Europe/Rome") 这样的命名区域是有意义的。 -
无论何时开始,片段都会将上午10:00转换为36,000;由于夏季时间和其他异常,它可能不会在午夜0点开始,并且可能在早上有一个间隙或重叠。要获得自该日开始以来的真实秒数,您将需要一些涉及
LocalDate.now(yourTimeZone).atStartOfDay(yourTimeZone) 的计算。
您可以使用SimpleDateFormat来提取小时分钟和秒。它适用于Java 7和Java 6以及Java 8,它适应您当地的时间和时区:
1 2 3 4 5 6 7 8 |
您可以将秒分钟小时字段转换为秒并添加它们
1 2 | Calendar c = new GregorianCalendar(); int totalSecs = c.get(Calendar.SECOND) + 60 * c.get(Calendar.MINUTE) + 3600 * c.get(Calendar.HOUR_OF_DAY); |