Java 8:从纪元时间

时间:2016-08-16 17:40:47

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

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

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

2 个答案:

答案 0 :(得分:4)

我将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.DateCalendar和& SimpleDateFormat

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

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

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

从哪里获取java.time类?

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

答案 1 :(得分:2)

Date的纪元以来,有一种方法可以使用毫秒:

long timeInMillis = date.getTime();

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

long weeksSinceEpoch = date.getTime() / 604800000;

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