Java中的时间常数?

问题描述 投票:61回答:12

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

java date time constants
12个回答
22
投票

Joda-Time包含Days等类,其中包含toStandardSeconds()等方法。所以你可以写:

int seconds = Days.ONE.toStandardSeconds();

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


0
投票
              60 * 1000 miliseconds in 1 minute
                     60     seconds in 1 minute
                      1      minute in 1 minute
                   1/60       hours in 1 minute
              1/(60*24)        days in 1 minute
          1/(60*24*365)       years in 1 minute
1/(60*24*(365 * 4 + 1))     4 years in 1 minute
                                                * 60            is in 1 hour
                                                * 60 * 24       is in 1 day
                                                * 60 * 24 * 365 is in 1 year
                                            etc.

我想,自己创建它们是最简单的。您可以使用DateCalendar类来执行时间和日期的计算。使用long数据类型处理大数字,例如1 Januari 1970 UTC,System.currentTimeMillis()的毫秒数。


0
投票

我对此表示怀疑,因为它们并非都是常数。一年的毫秒数会有所不同,对吗?


0
投票

如果你想获得值Calendar有所有与时间管理相关的领域,你可以做一些简单的反思

Field [] fields = Calendar.class.getFields();

for (Field f : fields)
{
  String fName = f.toString();
  System.out.println(fName.substring(fName.lastIndexOf('.')+1).replace("_", " ").toLowerCase());
}

这将输出:

era
year
month
week of year
week of month
date
day of month
day of year
day of week
day of week in month
am pm
hour
hour of day
minute
second
millisecond
zone offset
dst offset
field count
sunday
monday
tuesday
wednesday
thursday
friday
saturday
january
february
march
april
may
june
july
august
september
october
november
december
undecimber
am
pm
all styles
short
long

你可以从中排除你不需要的东西。

如果你只需要常数,你可以使用它们:Calendar.DAY_OF_MONTHCalendar.YEAR等等。


111
投票

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

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

这个:

long millis = hours * MINUTES_IN_HOUR * SECONDS_IN_MINUTE * MILLIS_IN_SECOND;

成为这个:

long millis = TimeUnit.HOURS.toMillis(hours);

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

public void yourFancyMethod(long somePeriod, TimeUnit unit) {
    int iNeedSeconds = unit.toSeconds(somePeriod);
}

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

int secondsInHour = TimeUnit.HOURS.toSeconds(1);

33
投票

如果在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

23
投票

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.

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

return create(Math.multiplyExact(days, SECONDS_PER_DAY), 0);

其中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.

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

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


13
投票

Java TimeUnit似乎就是你想要的


10
投票

Joda Time还有一个DateTimeConstants类,有MILLIS_PER_SECOND,SECONDS_PER_MINUTE,MILLIS_PER_DAY等等。


2
投票

虽然TimeUnit讨论的this AnswerDuration讨论的this Answer可能更直接地解决了问题,但Java中还有一些其他方便的时间单元特征。

java.time

java.time packageDayOfWeekMonth的复杂枚举。因此,您可以传递完整的对象,例如DayOfWeek.TUESDAYMonth.FEBRUARY,而不是仅传递一个数字或字符串。

java.time框架还包括诸如MonthDayYearMonthYear之类的类。同样,您可以传递完整的对象而不仅仅是数字或字符串,以使您的代码更加自我记录,确保有效值并提供类型安全性。

ThreeTen-Extra project

ThreeTen-Extra项目提供了使用java.time的其他类。这些包括:DayOfMonthDayOfYearAmPmQuarterYearQuarterYearWeekDaysWeeksMonthsYearsInterval


2
投票

这是我用来获得毫秒的东西。

import javax.management.timer.Timer;

Timer.ONE_HOUR
Timer.ONE_DAY
Timer.ONE_MINUTE
Timer.ONE_SECOND
Timer.ONE_WEEK

1
投票

另一种已经烘焙(用于多次调用)Duration实例(和0数学运算)的方法:

ChronoUnit.DAYS.getDuration().getSeconds()
© www.soinside.com 2019 - 2024. All rights reserved.