Java 8 : 获取纪元以来的周数

Java 8 : Get week number since epoch time

给定 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

虽然我们可以通过某种方式找到 "week number since epoch",但是否有使用 Java 8 找到它的干净解决方案?

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

Date:

纪元以来,有一个毫秒数的方法
long timeInMillis = date.getTime();

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

long weeksSinceEpoch = date.getTime() / 604800000;

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

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

tl;博士

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

LocalDate

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

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

这里我们使用 UTC 作为今天日期的时区,与 UTC 中定义的纪元一致。

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

ChronoUnit

ChronoUnit class 有计算经过的年数、月数或周数等的方法。对于数周,它只需要天数并除以 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 );

epoch: 1970-01-01 | today in UTC: 2016-08-29 | weeks: 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 framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

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

从哪里获得java.time classes?

  • Java SE 8, Java SE 9,及以后
    • 内置。
    • 标准 Java API 的一部分,带有捆绑实施。
    • Java 9 添加了一些小功能和修复。
  • Java SE 6 and Java SE 7
  • Android
    • Android java.time classes.
    • 捆绑实施的更高版本
    • 对于较早的 Android (<26),ThreeTenABP project adapts ThreeTen-Backport (mentioned above). See

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.