tl;博士
LocalDate.now().getDayOfYear()
……或者……
org.threeten.extra.DayOfYear.now()
“儒略日”术语
“朱利安日”一词有时用于表示一年中的 ordinal 或 Ordinal date,表示从 1 到 365 或 366 的数字 (leap years)。 1 月 1 日为 1,1 月 2 日为 2,12 月 31 日为 365(或闰年为 366)。
这种对Julian 的松散(不正确)使用可能来自use in astronomy 和其他跟踪日期字段,作为自公元前4713 年1 月1 日世界标准时间中午以来的连续天数(在Julian calendar 上)。如今,朱利安日期已接近 250 万,2,457,576 今天。
java.time
Java 8 及更高版本中内置的 java.time 框架提供了一种简单的工具来获取日期。
LocalDate 类表示没有时间和时区的仅日期值。您可以查询一年中的某一天。
LocalDate localDate = LocalDate.of ( 2010 , Month.JUNE , 8 );
int dayOfYear = localDate.getDayOfYear ();
转储到控制台。结果显示,2010 年 6 月 8 日确实是第 159 天。
System.out.println ( "localDate: " + localDate + " | dayOfYear: " + dayOfYear );
本地日期:2010-06-08 | dayOfYear: 159
时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因区域而异。例如,法国巴黎午夜过后的几分钟是新的一天,而魁北克蒙特利尔仍然是“昨天”。
ZoneId z = ZoneId.of( “America/Montreal” );
LocalDate today = LocalDate.now( z );
int dayOfYear = today.getDayOfYear ();
换个方向,从数字到日期。
LocalDate ld = Year.of( 2017 ).atDay( 159 ) ;
org.threeten.extra.DayOfYear
ThreeTen-Extra 库为 Java 内置的 java.time 类添加了功能。
这个库提供了一个类来明确表示任何一年的序数日:DayOfYear。使用此类而不是单纯的整数可以使您的代码更具自记录性,提供类型安全性并确保有效值。
DayOfYear dayOfYear = DayOfYear.from( LocalDate.of ( 2010 , Month.JUNE , 8 ) ) ;
获取具有特定年份的DayOfYear 的日期。
LocalDate localDate = dayOfYear.atYear( 2023 ) ;
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。 Hibernate 5 & JPA 2.2 支持 java.time。
从哪里获取 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。