获取自Java中的Epoch以来的天数,周数和月数

Ari*_*rdi 26 java time calendar epoch

我试图获得自Java中Epoch以来的天数,周数,月数.

Java Calendar类提供了诸如calendar.get(GregorianCalendar.DAY_OF_YEAR)或Calendar.get(GregorianCalendar.WEEK_OF_YEAR)之类的东西,这是一个很好的开始,但它并不能完全满足我的需要.

在Java中有一种优雅的方法吗?

小智 35

您可以使用Joda Time库轻松完成此操作 - 除了使用标准的Java Date和Calendar类之外,我还可以将它用于任何相关的时间.使用库查看下面的示例:

MutableDateTime epoch = new MutableDateTime();
epoch.setDate(0); //Set to Epoch time
DateTime now = new DateTime();

Days days = Days.daysBetween(epoch, now);
Weeks weeks = Weeks.weeksBetween(epoch, now);
Months months = Months.monthsBetween(epoch, now);

System.out.println("Days Since Epoch: " + days.getDays());
System.out.println("Weeks Since Epoch: " + weeks.getWeeks());
System.out.println("Months Since Epoch: " + months.getMonths());
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到以下输出:

Days Since Epoch: 15122
Weeks Since Epoch: 2160
Months Since Epoch: 496
Run Code Online (Sandbox Code Playgroud)

  • 这直接帮助我解决了我的问题.我遇到了一个问题,我将为后人分享这个问题.我注意到`secondsBetween`方法返回了一个与Java不同的值〜65350秒,我的修复是:(1)`epoch = new MutableDateTime(0l,DateTimeZone.UTC)`和(2)删除`epoch.setDate( 0)`.顺便提一下,我的当地时区是GMT + 1,我正在处理现有的时间戳. (3认同)
  • 现在处于[维护模式](https://en.wikipedia.org/wiki/Maintenance_mode)的[Joda-Time](http://www.joda.org/joda-time/)项目建议迁移到[java.time](http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html)类. (2认同)

sof*_*arn 22

java.time

使用Java 8及更高版本中内置的java.time类.

LocalDate now = LocalDate.now();
LocalDate epoch = LocalDate.ofEpochDay(0);

System.out.println("Days: " + ChronoUnit.DAYS.between(epoch, now));
System.out.println("Weeks: " + ChronoUnit.WEEKS.between(epoch, now));
System.out.println("Months: " + ChronoUnit.MONTHS.between(epoch, now));
Run Code Online (Sandbox Code Playgroud)

产量

Days: 16857
Weeks: 2408
Months: 553
Run Code Online (Sandbox Code Playgroud)

  • 如果只查找纪元日,可以直接使用java.time API LocalDate.now().toEpochDay() (8认同)
  • 我建议始终通过将 `ZoneId` 对象传递给 `LocalDate.now( zoneId )` 来指定时区,而不是隐式依赖 JVM 的当前默认区域。JVM 中任何应用程序的任何线程中的任何代码都可以在运行时随时更改该默认值。 (2认同)

min*_*dex 11

我有点惊讶,几乎所有的答案实际上都在计算epoch和之间的天数now。随着java.time.LocalDate它的那样简单:

LocalDate.now().toEpochDay()
Run Code Online (Sandbox Code Playgroud)


fer*_*ith 9

Long currentMilli = System.currentTimeMillis();
Long seconds = currentMilli / 1000;
Long minutes = seconds / 60;
Long hours = minutes / 60;
Long days = hours / 24;
System.out.println("Days since epoch : "  + days);
Run Code Online (Sandbox Code Playgroud)

要么

System.out.println("Days since epoch : "  + ((int) currentMilli / 86400000));
Run Code Online (Sandbox Code Playgroud)

  • 并非所有日子都有86,400秒. (18认同)
  • ...但由于Unix时间处理闰秒,86,400秒的计算是正确的,请参阅https://en.wikipedia.org/wiki/Unix_time#Leap_seconds (7认同)