给定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 8, Java SE 9,以及更高版本
- 内置。
- 标准Java API的一部分,捆绑实现。
Java 9增加了一些小的特性和修复。
- 大部分java。时间功能向后移植到Java 6;7在 ThreeTen-Backport 。
- Android版本的java bundle实现。时间类。
- 对于早期的Android (<26), ThreeTenABP项目适应ThreeTen-Backport(如上所述)。参见如何使用ThreeTenABP…。
Interval
、YearWeek
、YearQuarter
等。
标题>标题>
有一个方法可以用来计算Date
的毫秒since epoch:
long timeInMillis = date.getTime();
,显然一周有604800000毫秒。所以我猜你可以输入
long weeksSinceEpoch = date.getTime() / 604800000;
我认为你可能实际上需要添加1到你的最终值,虽然,因为Java截断long
s。