【问题标题】:Get current time of day in seconds以秒为单位获取当前时间
【发布时间】:2017-11-29 17:11:05
【问题描述】:

有没有办法以秒为单位获取当前时间?请注意,我问的是一天中的时间,而不是 UTC 时间。

我想要的是 0 - 86,400(12:00AM - 11:59PM)范围内的值(以秒为单位)。我正在开发一个每天运行的应用程序,当一天结束时,时间(以秒为单位)应该再次在 0 重新开始。

假设它是10:00AM。我应该得到 36,000 秒,如果我的时间是 5:00PM,我应该得到 61,200 秒。

PS:我不知道之前的时间。程序将使用currentTime() 函数自行解决。

【问题讨论】:

  • 你尝试/研究了什么?
  • 您是从系统时钟获取时间,还是从数据库等其他来源获取时间?
  • 一旦你得到了正确的LocalTime,你只需要打电话给toSecondOfDay...那么你有什么尝试得到正确的LocalTime
  • UTC 时间时间。我想你的意思是说你想要一天中的 local 时间而不是一天中的 UTC 时间。

标签: java java-time


【解决方案1】:

使用 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()

将时间提取为一天中的秒数,从 0 到 24 * 60 * 60 - 1。

【讨论】:

    【解决方案2】:

    使用java.time.LocalTimejava.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.'s answer 所指的LocalTime.now(ZoneId.of("timezone-name")))。

      作为timezone-name,始终使用IANA timezones names(始终采用Continent/City 的格式,例如America/Sao_PauloEurope/Berlin)。 避免使用三个字母的缩写(如CSTPST),因为它们是ambiguous and not standard。您可以致电ZoneId.getAvailableZoneIds() 获取可用时区列表(并选择最适合您系统的时区)。

    • 如果需要,您也可以调用 d.toSecondOfDay()(等效,因为 get(ChronoField) 在内部调用 toSecondOfDay)。

    【讨论】:

    • 这个解决方案的问题是我需要事先知道我想在什么时间获得秒数。如果我不将确切时间作为参数传递给 LocalTime.of() 函数,它将无法工作。
    • 这只是示例。如果您想从当前时间获取值,只需使用 LocalTime.now() - 我已经更新了答案 btw
    • 请将明确的时区传递给LocalTime.now()。否则很好。
    【解决方案3】:

    我建议:

        int secondsOfDay = LocalTime.now(ZoneId.of("Europe/Rome")).toSecondOfDay();
    

    注意事项:

    • 使用明确的时区来提醒读者和您自己时区的选择很重要,并且您已经做出了有意识的选择。 ZoneId.systemDefault(),或者更好的是如果在您的情况下提供一个命名区域(例如 ZoneId.of("Europe/Rome"))是有意义的。
    • 无论一天何时开始,sn-p 都会将上午 10:00 转换为 36,000;由于夏令时和其他异常情况,它可能没有在午夜 0:00 开始,并且可能在凌晨存在间隙或重叠。要获得自一天开始以来的真实秒数,您需要进行一些涉及LocalDate.now(yourTimeZone).atStartOfDay(yourTimeZone) 的计算。

    【讨论】:

      【解决方案4】:

      您可以将秒分小时字段转换为秒并将它们相加

      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.
      • @ControlAltDel 我将HOUR 更改为HOUR_OF_DAY,因为HOUR 是12 小时制。否则在下午时间,结果将不准确。
      • 恕我直言,当有标准库类可以为您完成时,您不想在答案中进行“手工计算”。后者更易于阅读且不易出错。其次,虽然答案给出了正确的结果(据我所知),但与程序员友好的现代类相比,CalendarGregorianCalendar 类(我是否提到它们早已过时)通常是一团糟,所以你要养成使用后者的习惯。只是我的 0.02 欧元。 @SVCS1994
      • @ControlAltDel 我赞成,因为即使它现在不是预期的答案(使用 Java 8),它也不值得负面评价。就个人而言,我可能会补充说,该解决方案适用于无法使用 Java 8 的情况。
      【解决方案5】:

      您可以使用 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 上工作)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 2017-02-20
      • 2011-04-19
      • 2016-07-04
      • 2017-04-25
      • 1970-01-01
      相关资源
      最近更新 更多