date-Java中的时间常量?
是否有一个Java包,其中包含所有令人讨厌的时间常数,例如分钟/小时/天/年的毫秒/秒/分钟? 我讨厌重复这样的事情。
12个解决方案
111 votes
如果您的项目中尚未包括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);
theadam answered 2019-10-05T22:44:46Z
33 votes
如果在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
Oded Breiner answered 2019-10-05T22:45:16Z
23 votes
Java 8 / java.time解决方案
作为LocalTime的替代方法,由于某些原因,您可能更喜欢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);
其中LocalTime是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常数包受到保护,而不是公开的,这是一个好问题,我相信这是有原因的。 目前看来,您确实必须复制它们并自己维护。
Mateusz Szulc answered 2019-10-05T22:46:12Z
22 votes
Joda-Time包含诸如Days之类的类,其中包含诸如toStandardSeconds()之类的方法。 所以你可以这样写:
int seconds = Days.ONE.toStandardSeconds();
虽然看起来有些冗长,但可能仅对更复杂的情况(例如leap年)有用。
Brian Agnew answered 2019-10-05T22:43:54Z
13 votes
Java TimeUnit似乎就是您想要的
Martin answered 2019-10-05T22:46:36Z
10 votes
Joda Time还具有DateTimeConstants类,其中包含MILLIS_PER_SECOND,SECONDS_PER_MINUTE,MILLIS_PER_DAY等内容。
Lindsay Thurmond answered 2019-10-05T22:47:00Z
2 votes
尽管本答案中讨论的TimeUnit和本答案中讨论的Duration可能更直接地解决了该问题,但Java中还有一些其他方便的时间单位功能。
java.time
java.time软件包具有用于DayOfMonth和DayOfMonth的复杂枚举。因此,您可以传递完整的对象(例如DayOfMonth或DayOfYear),而不用传递数字或字符串,而无需传递任何数字或字符串。
java.time框架还包括诸如DayOfMonth、DayOfYear和AmPm之类。同样,您可以传递完整的对象,而不仅仅是数字或字符串,以使代码更具自文档性,确保有效值并提供类型安全性。 。
ThreeTen-Extra项目
ThreeTen-Extra项目提供了其他与java.time一起使用的类。 其中包括:DayOfMonth,DayOfYear,AmPm,Quarter,YearQuarter,YearWeek,Days,Weeks,Months,Years和Interval。
Basil Bourque answered 2019-10-05T22:47:57Z
2 votes
这是我用来获取毫秒数的方法。
import javax.management.timer.Timer;
Timer.ONE_HOUR
Timer.ONE_DAY
Timer.ONE_MINUTE
Timer.ONE_SECOND
Timer.ONE_WEEK
Reaz Murshed answered 2019-10-05T22:48:24Z
1 votes
已烘烤(用于多次调用)的另一种方法是Duration实例(以及0个数学运算):
ChronoUnit.DAYS.getDuration().getSeconds()
Vladislav Denisko answered 2019-10-05T22:48:52Z
0 votes
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()。
Pindatjuh answered 2019-10-05T22:49:21Z
0 votes
我对此表示怀疑,因为它们不是全部常数。 一年的毫秒数不一样,对吧?
duffymo answered 2019-10-05T22:49:48Z
0 votes
如果您想获得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、2556403555889054721等。
Jack answered 2019-10-05T22:50:42Z