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



给定LocalDate,我想转换为自Epoch以来的周数

方法之一是:

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

虽然我们可以找到"自epoch以来的周数",但是否有使用Java 8找到它的干净解决方案?

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

我正在把Tunaki的评论变成一个答案。

<标题> tl;博士
ChronoUnit.WEEKS.between ( 
    LocalDate.ofEpochDay ( 0 ) , 
    LocalDate.now( ZoneOffset.UTC ) 
)

LocalDate

LocalDate类表示一个只有日期的值,没有时间和时区。

在确定日期时,时区是至关重要的。对于任何给定的时刻,全球不同地区的日期都是不同的。例如,在法国巴黎,午夜过后几分钟是新的一天,而在montrsamal qusambec中仍然是"昨天"。

这里我们使用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 );

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框架内置于Java 8及以后版本中。这些类取代了麻烦的旧的遗留日期时间类,如java.util.Date, Calendar, &SimpleDateFormat .

Joda-Time项目,现在处于维护模式,建议迁移到java。时间类。

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

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

从哪里获取java。时间类?

  • Java SE 8Java SE 9,以及更高版本
    • 内置。
    • 标准Java API的一部分,捆绑实现。
  • Java 9增加了一些小的特性和修复。
  • Java SE 6Java SE 7
    • 大部分java。时间功能向后移植到Java 6;7在 ThreeTen-Backport
  • Android
    • Android版本的java bundle实现。时间类。
    • 对于早期的Android (<26), ThreeTenABP项目适应ThreeTen-Backport(如上所述)。参见如何使用ThreeTenABP…
  • ThreeTen-Extra项目扩展了java。有额外课程的时间。这个项目是将来可能添加到java.time的试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等。

    有一个方法可以用来计算Date的毫秒since epoch:

    long timeInMillis = date.getTime();
    

    ,显然一周有604800000毫秒。所以我猜你可以输入

    long weeksSinceEpoch = date.getTime() / 604800000;
    

    我认为你可能实际上需要添加1到你的最终值,虽然,因为Java截断long s。

    相关内容

    • 没有找到相关文章

    最新更新