有没有办法在几秒钟内获得当天的当前时间? 注意我问的是当天的时间,而不是UTC时间。
我想要的是0到86,400(12:00 AM - 11:59 PM)之间的值(以秒为单位)。 我正在开发一个每天工作的应用程序,当这一天结束时,时间(以秒为单位)应该再次重新开始0。
所以我们说它是10:00AM。 我应该得到36,000秒,如果我的时间是5:00PM,我应该得到61,200秒。
PS:我不知道手头的时间。 该程序将使用currentTime()函数自行计算出来。
你有什么尝试/研究过的?
您是从系统时钟,还是从数据库等其他来源获取时间?
一旦你有了正确的LocalTime,你只需要调用toSecondOfDay ...那么你有什么想要得到正确的LocalTime?
获取当前时间的可能重复
对不起的家伙,我没有那么好的研究。 我只看了你的答案,看起来都很可行。 对不起,我浪费了你的时间。
UTC时间是一天中的时间。 我想你的意思是说你想要当地时间而不是UTC时间。
谢谢你的提示! :) @jameslarge
使用Java 8,您可以创建Duration实例。
例如 :
LocalDateTime date = LocalDateTime.now();
long seconds = Duration.between(date.withSecond(0).withMinute(0).withHour(0), date).getSeconds();
或者更简单地说,您可以将LocalDateTime转换为LocalTime实例,然后应用toSecondOfDay()方法:
LocalDateTime date = LocalDateTime.now();
int seconds = date.toLocalTime().toSecondOfDay();
来自java.time.LocalTime javadoc:
public int toSecondOfDay()
Extracts the time as seconds of day, from 0 to 24 * 60 * 60 - 1.
使用java.time.LocalTime和java.time.temporal.ChronoField:
// 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)。
这个解决方案的问题是我需要事先知道我什么时候想要获得秒数。如果我没有将确切的时间作为参数传递给LocalTime.of()函数,它将无法工作。
这只是一个例子。如果你想从当前时间获得值,只需使用LocalTime.now() - 我已经更新了答案btw
请将明确的时区传递给LocalTime.now()。否则很好。
我建议:
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,它适应您当地的时间和时区:
String timeNowHMS[] = new SimpleDateFormat("HH:mm:ss", Locale.ENGLISH)
.format(System.currentTimeMillis())
.split(":");
int secondsPassedInTheDay =
Integer.parseInt(timeNowHMS[0]) * 60 * 60
+ Integer.parseInt(timeNowHMS[1]) * 60
+ Integer.parseInt(timeNowHMS[2]);
感谢您使用SimpleDateFormat展示了这是多么复杂和手持。另一个反对使用它的论点(java.time,现代Java日期和时间API也适用于Java 6,7和8)。
您可以将秒分钟小时字段转换为秒并添加它们
Calendar c = new GregorianCalendar();
int totalSecs = c.get(Calendar.SECOND) + 60 * c.get(Calendar.MINUTE) + 3600 * c.get(Calendar.HOUR_OF_DAY);
当提问者使用java.time包标记问题时,请不要建议使用长期过时的Calendar类。即使这个标签不存在,你也不应该,或者至少在没有提到其他选项的情况下,因为Java日期&提到的包中的时间API要好得多,程序员友好得多,无论是一般情况还是特殊情况。
所以即使我得到了我想要的答案,他的解决方案效率还不够好? @ OleV.V。
@ SVCS1994您使用的是Java 8的java.time包吗?你没有真正指明你的问题,除了可能误导你的标签。
是。我想因为我读它更有效,但是如果@ControlAltDel的解决方案和我使用该包一样高效,那么我想我可以使用他的解决方案。我是新的Java 8包btw。
@ControlAltDel我将HOUR更改为HOUR_OF_DAY,因为HOUR是一个12小时制。否则,对于PM小时,结果将是不准确的。
恕我直言,当有标准的库类可以为你做的时候,你不想在答案中进行"手动计算"。后者阅读更清晰,错误更少。第二,虽然答案给出了正确的结果(据我所知),类Calendar和GregorianCalendar(我提到它们已经过时了)与程序员友好的现代类相比,通常是一团糟,所以你会想养成使用后者的习惯。只需我0.02欧元。 @ SVCS1994
@ControlAltDel我赞成,因为即使它现在不是预期的答案(使用Java 8),它也不值得进行否定评估。就个人而言,我可能会补充说,解决方案适用于无法使用Java 8的情况。