【问题标题】:Java 8 : Get week number since epoch timeJava 8:获取自纪元时间以来的周数
【发布时间】:2016-12-23 04:51:46
【问题描述】:

给定 LocalDate 我想转换为纪元以来的周数

一种方法是:

LocalDate date = datePicker.getValue(); // input from your date picker
Locale locale = Locale.US;
int weekOfYear = date.get(WeekFields.of(locale).weekOfWeekBasedYear());

And X = find weeks since Epoch to prevYear

And then result = X + weekOfYear

虽然我们可以通过某种方式找到“自纪元以来的周数”,但是否有使用 Java 8 找到它的干净解决方案?

更新: 即使上述解决方案也不会起作用,因为一周(总是从星期日开始)可以跨越两年

【问题讨论】:

  • 我可能遗漏了什么,但不只是ChronoUnit.WEEKS.between(LocalDate.ofEpochDay(0), localDate)吗?

标签: java datetime java-8 week-number localdate


【解决方案1】:

我正在将 Tunaki 的评论变成答案。

tl;博士

ChronoUnit.WEEKS.between ( 
    LocalDate.ofEpochDay ( 0 ) , 
    LocalDate.now( ZoneOffset.UTC ) 
)

LocalDate

LocalDate 类表示没有时间和时区的仅日期值。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因区域而异。例如,法国巴黎午夜过后的几分钟是新的一天,而魁北克蒙特利尔仍然是“昨天”。

根据 UTC 中定义的纪元,我们使用 UTC 作为今天日期的时区。

LocalDate today = LocalDate.now( ZoneOffset.UTC );

ChronoUnit

ChronoUnit 类具有计算经过的年数、月数或周数等的方法。对于几周,它只需要天数并除以 7。因此,一周中的第一天是无关紧要的。不确定这是否满足您的需求,因为问题含糊不清。

LocalDate today = LocalDate.now ( ZoneOffset.UTC );  // Using UTC to match the definition of the Java epoch.
LocalDate epoch = LocalDate.ofEpochDay ( 0 );

long weeks = ChronoUnit.WEEKS.between ( epoch , today );

转储到控制台。

System.out.println ( "epoch: " + epoch + " | today in UTC: " + today + " | weeks: " + weeks );

时代:1970-01-01 |今天在UTC:2016-08-29 |周数:2434

如果这对您的需求有意义,您可以将开始日期调整为特定的星期几。我不确定这是否合适,因为问题不清楚。

LocalDate epoch = LocalDate.ofEpochDay ( 0 );
LocalDate start = epoch.with ( TemporalAdjusters.nextOrSame ( DayOfWeek.SUNDAY ) ); // Get the first Sunday that *is* the epoch or *follows* the epoch.
long weeks = ChronoUnit.WEEKS.between ( start , today );

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

从哪里获得 java.time 类?

  • Java SE 8Java SE 9 及更高版本
    • 内置。
    • 标准 Java API 的一部分,带有捆绑实现。
    • Java 9 添加了一些小功能和修复。
  • Java SE 6Java SE 7
    • ThreeTen-Backport 中的大部分 java.time 功能都向后移植到 Java 6 和 7。
  • Android
    • java.time 类的 Android 捆绑包实现的更高版本。
    • 对于早期的 Android (ThreeTenABP 项目采用 ThreeTen-Backport(如上所述)。见How to use ThreeTenABP…

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    【解决方案2】:

    对于Date,有一个自纪元以来毫秒的方法:

    long timeInMillis = date.getTime();
    

    显然一周有 604800000 毫秒。所以我想你可以去

    long weeksSinceEpoch = date.getTime() / 604800000;
    

    我认为您实际上可能需要在最终值上加 1,因为 Java 会截断 longs。

    【讨论】:

      猜你喜欢
      • 2012-08-05
      • 2022-10-05
      • 2016-05-14
      • 2013-03-26
      • 1970-01-01
      • 2011-10-24
      • 2012-12-11
      • 1970-01-01
      • 2019-12-04
      相关资源
      最近更新 更多