【问题标题】:Get the number of days, weeks, and months, since Epoch in Java获取自 Java 中的 Epoch 以来的天数、周数和月数
【发布时间】:2011-09-03 17:21:18
【问题描述】:

我试图在 Java 中获取自 Epoch 以来的天数、周数、月数。

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

在 Java 中是否有一种优雅的方法可以做到这一点?

【问题讨论】:

  • 你的意思是需要找到从纪元开始的天数,从纪元开始的周数,数字自纪元以来的几个月? 或者,你的意思是你需要用最有效的表示,用月、周和天来显示自纪元以来的时间?
  • 第一个。对于给定的日期(通常是 now()),我需要获取自纪元以来的天数,周数,月数。跨度>

标签: java time calendar epoch


【解决方案1】:

您可以使用Joda Time library 轻松完成此操作 - 除了使用标准 Java 日期和日历类之外,我将它用于与时间相关的任何事情。看看下面使用该库的示例:

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());

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

Days Since Epoch: 15122
Weeks Since Epoch: 2160
Months Since Epoch: 496

【讨论】:

  • 这直接帮助我解决了我的问题。我遇到了一个问题,我将分享给后人。我注意到 secondsBetween 方法返回的值与 Java 相差约 65350 秒,我的解决方法是:(1) epoch = new MutableDateTime(0l, DateTimeZone.UTC) 和 (2) 删除 epoch.setDate(0)。顺便说一句,我的本地时区是 GMT+1,我正在使用现有的时间戳。
  • 我认为epoch.setTime(0)也是正确获取时间的必要条件。
  • Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
  • @BasilBourque 感谢您提及 Joda-time 的维护模式。它是 Java 项目到 v1.7 的最佳库
  • @gaurav java.time 的大部分功能都在 ThreeTen-Backport 项目中向后移植到 Java 6 和 Java 7。在 ThreeTenABP 项目中进一步适应了早期的 Android。 Joda-Time、java.time 和 ThreeTen-Backport 都由同一个人 Stephen Colebourne 领导。
【解决方案2】:

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));

输出

Days: 16857
Weeks: 2408
Months: 553

【讨论】:

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

我有点惊讶,几乎所有答案实际上都是在计算 epochnow 之间的天数。使用java.time.LocalDate 很简单:

LocalDate.now().toEpochDay()

【讨论】:

    【解决方案4】:
    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);
    

    System.out.println("Days since epoch : "  + ((int) currentMilli / 86400000));
    

    【讨论】:

    • 并非所有日子都有 86,400 秒。
    • ...但是由于 Unix 时间处理闰秒,86,400 秒的计算是正确的,请参阅en.wikipedia.org/wiki/Unix_time#Leap_seconds
    • @EngineerBetter_DJ,你能告诉我所有的日子怎么不会是 86400 秒?
    • @MayankJain 夏令时?有些日子有 23 小时,有些是 25 小时。
    • @ferronrsmith 是对的。可以通过jdk1.8LocalDateTime.ofEpochSecond()方法来证明。一些关键代码:long localEpochDay = Math.floorDiv(localSecond, SECONDS_PER_DAY);
    【解决方案5】:
    Calendar now = Calendar.getInstance();
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(0); // start at EPOCH
    
    int days = 0
    while (cal.getTimeInMillis() < now.getTimeInMillis()) {
      days += 1
      cal.add(Calendar.DAY_OF_MONTH, 1) // increment one day at a time
    }
    System.out.println("Days since EPOCH = " + days);
    

    【讨论】:

    • 为什么是 DAY_OF_MONTH 而不是 DAY_OF_YEAR?它会有所作为吗?似乎这也可以持续数天、数周和数月,对吧?
    【解决方案6】:

    我不希望有一种优雅的方式来做到这一点,因为这不是一个很常见的要求。我不禁想知道你为什么要这样做......

    但无论如何,我的做法是从Calendar 中减去纪元日期,然后得到你想要的字段:

    Calendar timeSinceEpoch = Calendar.getInstance();
    timeSinceEpoch.add(Calendar.YEAR, -1970);
    
    int yearsSinceEpoch = timeSinceEpoch.get(Calendar.YEAR);
    int monthsSinceEpoch = timeSinceEpoch.get(Calendar.MONTH) + 12 * yearsSinceEpoch;
    

    【讨论】:

      【解决方案7】:

      Date.getTime() - 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。

      您可以使用它并了解您关心的间隔中有多少毫秒来进行计算。

      【讨论】:

      • 自从 DST 发明以来,您无法完全确定一天或一周中的(毫秒)秒数。为了让事情变得更复杂,闰秒也存在。
      • 由于闰年和其他奇怪的日历例外情况,走这条路线会使计算月数变得非常困难。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-01
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多