java获取秒时间_关于java:以秒为单位获取当前时间

有没有办法在几秒钟内获得当天的当前时间? 注意我问的是当天的时间,而不是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的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值