给定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找到它的干净解决方案?
更新: 即使是上述解决方案也不会工作一周(总是从星期日开始)可以跨越两年
答案 0 :(得分:4)
我将Tunaki的评论转为答案。
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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance 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的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 1 :(得分:2)
自Date
的纪元以来,有一种方法可以使用毫秒:
long timeInMillis = date.getTime();
显然一周有604800000毫秒。所以我想你可以去
long weeksSinceEpoch = date.getTime() / 604800000;
我认为您可能实际上需要在最终值中添加1,因为Java会截断long
。