时间在Java?

Yos*_*ale 63 java time date constants

是否有一个Java包,包含所有烦人的时间常数,如毫秒/秒/分钟,分钟/小时/天/年?我不想复制那样的东西.

the*_*dam 117

如果你不在你的项目中包含joda-time,我会选择java TimeUnit.您不需要包含外部库,它非常简单.

每当你需要那些"讨厌的常数"时,你通常需要它们多个数字来进行跨单元转换.相反,您可以使用TimeUnit简单地转换值而无需显式乘法.

这个:

long millis = hours * MINUTES_IN_HOUR * SECONDS_IN_MINUTE * MILLIS_IN_SECOND;
Run Code Online (Sandbox Code Playgroud)

成为这个:

long millis = TimeUnit.HOURS.toMillis(hours);
Run Code Online (Sandbox Code Playgroud)

如果您公开一个接受某些值的方法,比如millis然后需要转换它,那么最好遵循java并发API的作用:

public void yourFancyMethod(long somePeriod, TimeUnit unit) {
    int iNeedSeconds = unit.toSeconds(somePeriod);
}
Run Code Online (Sandbox Code Playgroud)

如果你真的非常需要常数,你仍然可以通过调用以下方式获得一小时内的秒数:

int secondsInHour = TimeUnit.HOURS.toSeconds(1);
Run Code Online (Sandbox Code Playgroud)

  • 完全同意您的解决方案,以避免不必要地依赖第三方库 (3认同)

Ode*_*ner 34

如果在Android上,我建议:

android.text.format.DateUtils

DateUtils.SECOND_IN_MILLIS
DateUtils.MINUTE_IN_MILLIS
DateUtils.HOUR_IN_MILLIS
DateUtils.DAY_IN_MILLIS
DateUtils.WEEK_IN_MILLIS
DateUtils.YEAR_IN_MILLIS
Run Code Online (Sandbox Code Playgroud)


Mat*_*ulc 28

Java 8/java.time解决方案

作为替代方案TimeUnit,您可能出于某种原因更喜欢java.time包中的Duration类:

Duration.ofDays(1).getSeconds()     // returns 86400;
Duration.ofMinutes(1).getSeconds(); // 60
Duration.ofHours(1).toMinutes();    // also 60
//etc.
Run Code Online (Sandbox Code Playgroud)

此外,如果您更深入并分析了Duration.ofDays(..)方法的工作原理,您将看到以下代码:

return create(Math.multiplyExact(days, SECONDS_PER_DAY), 0);
Run Code Online (Sandbox Code Playgroud)

哪个SECONDS_PER_DAY是来自LocalTime类的包保护的静态常量.

/**
 * Seconds per day.
 */
static final int SECONDS_PER_DAY = SECONDS_PER_HOUR * HOURS_PER_DAY;

//there are also many others, like HOURS_PER_DAY, MINUTES_PER_HOUR, etc.
Run Code Online (Sandbox Code Playgroud)

我认为可以安全地假设,如果有任何软件包,它会定义"所有烦人的时间常数,如毫秒/秒/分钟",我相信Java SDK开发人员会使用它们.

为什么这个LocalTime常量包被保护而不是公开这是一个好问题,我相信这是有原因的.现在看起来你真的必须复制它们并自己维护.

  • 与仅执行计算的 TimeUnit.DAYS.toSeconds(1) 相比,Duration.ofDays(1).getSeconds() 将创建并丢弃一个对象来完成其工作。 (2认同)
  • 我认为绝对没有理由使用 Duration 如果您需要它们做的只是转换为一个值。如果您需要,最好在 API 中使用 Duration,在某些情况下,这比将 value 和 unit 指定为 2 个单独的参数更具可读性。我会记得有时很快就会更新我的答案以表明这一点。 (2认同)

Bri*_*new 23

Joda-Time包含诸如Days之类的类,其中包含诸如toStandardSeconds()之类的方法.所以你可以写:

int seconds = Days.ONE.toStandardSeconds();
Run Code Online (Sandbox Code Playgroud)

虽然它看起来有点冗长,但也许只适用于更复杂的场景,如闰年等.

  • 请参阅Joda-Time中的[`DateTimeConstants`](http://www.joda.org/joda-time/apidocs/org/joda/time/DateTimeConstants.html)课程. (4认同)
  • 仅供参考:[Joda-Time](http://www.joda.org/joda-time/)项目,现在处于[维护模式](https://en.wikipedia.org/wiki/Maintenance_mode),建议迁移到[java.time](http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html)类. (3认同)

Mar*_*tin 14

Java TimeUnit似乎就是你想要的


Lin*_*ond 11

Joda Time还有一个DateTimeConstants类,包括MILLIS_PER_SECOND,SECONDS_PER_MINUTE,MILLIS_PER_DAY等等.


Rea*_*hed 6

这是我用来获取毫秒的方法。

import javax.management.timer.Timer;

Timer.ONE_HOUR
Timer.ONE_DAY
Timer.ONE_MINUTE
Timer.ONE_SECOND
Timer.ONE_WEEK
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 5

虽然本答案TimeUnit中的讨论和本答案中的讨论可能更直接地解决了问题,但 Java 中还有一些其他方便的时间单位功能。Duration

java.time

对于单位,请参阅ChronoUnit枚举:

  • FOREVER
  • ERAS
  • MILLENNIA
  • CENTURIES
  • DECADES
  • YEARS
  • MONTHS
  • WEEKS
  • DAYS
  • HALF_DAYS
  • HOURS
  • MINUTES
  • SECONDS
  • MILLIS
  • MICROS
  • NANOS

java.time具有复杂的DayOfWeek和枚举Month。因此,您可以传递成熟的对象,例如DayOfWeek.TUESDAY或 ,而不是仅仅传递数字或字符串Month.FEBRUARY

MonthDayjava.time 框架还包括、YearMonth、 和 等类Year。同样,您可以传递成熟的对象而不仅仅是数字或字符串,以使您的代码更加自记录,确保有效值并提供类型安全。

TimeUnit和之间的转换ChronoUnit

我们可以轻松地在TimeUnit和之间进行转换ChronoUnit。请参阅添加到旧类中的新方法TimeUnit

三十额外项目

ThreeTen -Extra项目提供了与 java.time 一起使用的附加类。其中包括:DayOfMonthDayOfYearAmPmQuarterYearQuarterYearWeekDaysWeeksMonthsYearsInterval