Java 8:从纪元时间开始获取周数

给定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找到它的干净解决方案?

更新:即使上面的解决方案不会工作一周(总是从星期日开始)可能跨越两年

我将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及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

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

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • 更高版本的Android捆绑java.time类的实现。
    • 对于早期的Android(<26), ThreeTenABP项目采用ThreeTen-Backport (如上所述)。 请参见如何使用ThreeTenABP ….

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。

Date纪元开始,有一种方法可以存在毫秒:

 long timeInMillis = date.getTime(); 

并且显然每周有604800000毫秒。 所以我想你可以去

 long weeksSinceEpoch = date.getTime() / 604800000; 

我认为你可能实际上需要在你的最终值中添加1,因为Java截断了long