Java中的时间常数?

时间:2010-03-14 14:41:41

标签: java date time constants

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

12 个答案:

答案 0 :(得分:112)

如果你的项目中没有包含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);

答案 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

答案 2 :(得分:24)

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 Developers会使用它们。

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

答案 3 :(得分:22)

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

int seconds = Days.ONE.toStandardSeconds();

虽然看起来有点冗长,但也许仅适用于更复杂的情况,如闰年等。

答案 4 :(得分:13)

Java TimeUnit似乎就是你想要的

答案 5 :(得分:10)

Joda Time也有一个DateTimeConstants课,有MILLIS_PER_SECOND,SECONDS_PER_MINUTE,MILLIS_PER_DAY等等。

答案 6 :(得分:2)

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

java.time

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

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

ThreeTen-Extra项目

ThreeTen-Extra项目提供了其他类来处理java.time。其中包括:DayOfMonthDayOfYearAmPmQuarterYearQuarterYearWeekDaysWeeksMonthsYearsInterval

答案 7 :(得分:2)

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

import javax.management.timer.Timer;

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

答案 8 :(得分: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()的毫秒数。

答案 9 :(得分:0)

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

答案 10 :(得分: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等等。

答案 11 :(得分:0)

如果将这些常量用作编译时常量(例如,用作注释中的属性),那么Apache DateUtils将派上用场。

import org.apache.commons.lang.time.DateUtils;
DateUtils.MILLIS_PER_SECOND
DateUtils.MILLIS_PER_MINUTE
DateUtils.MILLIS_PER_HOUR
DateUtils.MILLIS_PER_DAY

这些是原始的长常量。