是否有一个Java程序包,其中包含所有烦人的时间常数,例如分钟/小时/天/年的毫秒/秒/分钟?我讨厌重复这样的事情。
是否有一个Java程序包,其中包含所有烦人的时间常数,例如分钟/小时/天/年的毫秒/秒/分钟?我讨厌重复这样的事情。
Answers:
如果您的项目中尚未包括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);
如果在android上,我建议:
DateUtils.SECOND_IN_MILLIS
DateUtils.MINUTE_IN_MILLIS
DateUtils.HOUR_IN_MILLIS
DateUtils.DAY_IN_MILLIS
DateUtils.WEEK_IN_MILLIS
DateUtils.YEAR_IN_MILLIS
作为的替代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
常量包受保护而不是公开的,这是一个好问题,我相信这是有原因的。现在看来,您确实必须复制它们并自己维护。
Duration.ofDays(1).getSeconds()
与TimeUnit.DAYS.toSeconds(1)
仅执行计算的对象相比,它将创建并丢弃一个对象来执行其工作。
这是我用来获取毫秒数的方法。
import javax.management.timer.Timer;
Timer.ONE_HOUR
Timer.ONE_DAY
Timer.ONE_MINUTE
Timer.ONE_SECOND
Timer.ONE_WEEK
同时TimeUnit
在本答案中Duration
讨论和在本答案中讨论可能更直接解决的问题,也有一些其他方便的单位-的时间特征在Java中。
有关单位,请参见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
。
所述java.time框架还包括类,如MonthDay
,YearMonth
和Year
。同样,您可以传递完整的对象,而不仅仅是数字或字符串,以使您的代码更具自记录性,确保有效值并提供类型安全性。
TimeUnit
和之间转换ChronoUnit
我们可以轻松地在TimeUnit
和之间进行转换ChronoUnit
。请参阅添加到旧类中的新方法TimeUnit
。
该ThreeTen-EXTRA项目提供额外的类与java.time工作。这些措施包括:DayOfMonth
,DayOfYear
,AmPm
,Quarter
,YearQuarter
,YearWeek
,Days
,Weeks
,Months
,Years
,和Interval
。
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.
我想自己创建它们是最简单的。您可以使用Date
和Calendar
类对时间和日期进行计算。使用long
数据类型可处理大量数据,例如1 Januari 1970 UTC以来的毫秒数System.currentTimeMillis()
。
如果您要获取值 Calendar
具有与时间管理相关的所有字段,则可以进行一些简单的反映
Field []字段= 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_MONTH
,Calendar.YEAR
依此类推。