以秒为单位获取当前时间

Get current time of day in seconds

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

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

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

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

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

Calendar c = new GregorianCalendar();
int totalSecs = c.get(Calendar.SECOND) + 60 * c.get(Calendar.MINUTE) + 3600 * c.get(Calendar.HOUR_OF_DAY);

使用 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.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()(或 指出的 LocalTime.now(ZoneId.of("timezone-name")))。

    作为 timezone-name,始终使用 IANA timezones names(始终采用 Continent/City 格式,如 America/Sao_PauloEurope/Berlin)。 避免使用 3 个字母的缩写(如 CSTPST),因为它们是 ambiguous and not standard。您可以通过调用 ZoneId.getAvailableZoneIds().

  • 获取可用时区列表(并选择最适合您的系统的时区)
  • 如果需要,您也可以调用 d.toSecondOfDay()(这等同于 get(ChronoField) 内部调用 toSecondOfDay)。

我建议:

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

注意事项:

  • 使用明确的时区来提醒 reader 和您自己时区的选择很重要,并且您做出了有意识的选择。 ZoneId.systemDefault(),或者更好的是,如果在您的情况下提供命名区域(例如 ZoneId.of("Europe/Rome").
  • 有意义)
  • 代码段将 10:00 AM 转换为 36,000,无论这一天何时开始;由于夏令时和其他异常情况,它可能不会在 0:00 午夜开始,并且可能在清晨出现间隙或重叠。要获得自一天开始以来的真实秒数,您需要进行一些涉及 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]);