在Java中的时间常量?
是否有一个Java包,所有恼人的时间常量,如一分钟/小时/天/年的毫秒/秒/分钟? 我不想重复这样的事情。
Joda-Time包含诸如Days之类的类,其中包含诸如toStandardSeconds()之类的方法。 所以你可以写:
int seconds = Days.ONE.toStandardSeconds();
虽然看起来有点冗长,也许只对更复杂的场景有用,比如闰年等。
如果你没有在你的项目中joinjoda-time,我会用java TimeUnit去。 你不需要包含一个外部库,这是相当简单的。
每当你需要那些“令人讨厌的常量”时,你通常需要它们为某个数字进行跨单位转换。 相反,您可以使用TimeUnit简单地转换这些值,而不需要显式的乘法运算。
这个:
long milis = hours * MINUTES_IN_HOUR * SECONDS_IN_MINUTE * MILLIS_IN_SECOND;
变成这样:
long milis = 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上,我build议:
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
Java 8 / java.time解决scheme
作为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
常量包被保护而不公开,这是个好问题,我相信这是有原因的。 现在看起来你真的必须复制它们并保持自己的状态。
Java TimeUnit似乎是你想要的
Joda时间还有一个DateTimeConstants
类,如MILLIS_PER_SECOND,SECONDS_PER_MINUTE,MILLIS_PER_DAY等等。
虽然本答案中讨论的TimeUnit
讨论的问题可能更直接地解决了这个问题,但Java中还有一些其他方便的单元时间function。
java.time
java.time包具有DayOfWeek
和Month
复杂枚举。 所以,不要传递一个数字或string,你可以传递完整的对象,如DayOfWeek.TUESDAY
或Month.FEBRUARY
。
java.time框架还包括诸如MonthDay
, YearMonth
和Year
类的类。 再次,您可以传递完整的对象而不仅仅是数字或string,以使您的代码更加自我logging,确保有效的值,并提供types安全性。
ThreeTen-Extra项目
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
类来执行具有时间和date的计算。 使用long
数据types可以处理大量数据,例如从1970年1月1日UTC, System.currentTimeMillis()
毫秒数。
我怀疑它,因为它们不是所有的常量。 一年的毫秒数是变化的,对吧?
如果你的意思是获取值Calendar
有所有与时间pipe理相关的领域,用一些简单的思考就可以做到
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_MONTH
, Calendar.YEAR
等等..
这是我用来获得毫秒的。
import javax.management.timer.Timer; Timer.ONE_HOUR Timer.ONE_DAY Timer.ONE_MINUTE Timer.ONE_SECOND Timer.ONE_WEEK