我正在将 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.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。