我在http://www.rgagnon.com/javadetails/java-0506.html上看过"解决方案" ,但它无法正常工作.例如,昨天(6月8日)应该是159,但它说它是245.
那么,有人在Java中有一个解决方案来获取当前日期的三位数朱利安日(不是朱利安日期 - 我需要今年的这一天)吗?
谢谢!标记
mar*_*ami 10
DateFormat d = new SimpleDateFormat("D");
System.out.println(d.format(date));
Run Code Online (Sandbox Code Playgroud)
LocalDate.now().getDayOfYear()
Run Code Online (Sandbox Code Playgroud)
…或者…
org.threeten.extra.DayOfYear.now()
Run Code Online (Sandbox Code Playgroud)
术语“儒略日”有时被松散地用来表示一年中的序数日,或序数日期,意思是从 1 到 365 或 366(闰年)的数字。1 月 1 日是1,1 月 2 日是2,12 月 31 日是365(或366闰年)。
这种松散(不正确)的使用Julian可能来自于在天文学和其他领域中使用的跟踪日期作为自公元前 4713 年 1 月 1 日世界时间(儒略历)中午以来的连续天数计数。如今,朱利安日期已接近 250 万,2,457,576今天。
Java 8 及更高版本中内置的 java.time 框架提供了一种简单的工具来获取年份。
该LocalDate级表示没有时间一天和不同时区的日期,唯一的价值。您可以询问一年中的哪一天。
LocalDate localDate = LocalDate.of ( 2010 , Month.JUNE , 8 );
int dayOfYear = localDate.getDayOfYear ();
Run Code Online (Sandbox Code Playgroud)
转储到控制台。结果显示,2010 年 6 月 8 日确实是第 159 天。
System.out.println ( "localDate: " + localDate + " | dayOfYear: " + dayOfYear );
Run Code Online (Sandbox Code Playgroud)
本地日期:2010-06-08 | 一年中的第 159 天
时区对于确定日期至关重要。对于任何给定时刻,日期因地区而异。例如,在法国巴黎午夜过后几分钟是新的一天,而在魁北克蒙特利尔仍然是“昨天”。
ZoneId z = ZoneId.of( “America/Montreal” );
LocalDate today = LocalDate.now( z );
int dayOfYear = today.getDayOfYear ();
Run Code Online (Sandbox Code Playgroud)
走向另一个方向,从数字到日期。
LocalDate ld = Year.of( 2017 ).atDay( 159 ) ;
Run Code Online (Sandbox Code Playgroud)
org.threeten.extra.DayOfYear该ThreeTen-EXTRA库将功能添加到java.time内置Java类。
这个库提供了一个类来明确表示任何一年的序数日:DayOfYear。使用这个类而不是单纯的整数可以使您的代码更具自文档性,提供类型安全性,并确保有效值。
DayOfYear dayOfYear = DayOfYear.from( LocalDate.of ( 2010 , Month.JUNE , 8 ) ) ;
Run Code Online (Sandbox Code Playgroud)
获取DayOfYear特定年份的日期。
LocalDate localDate = dayOfYear.atYear( 2023 ) ;
Run Code Online (Sandbox Code Playgroud)
该java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat。
要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是JSR 310。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
您可以直接与您的数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC 驱动程序。不需要字符串,不需要类。Hibernate 5 & JPA 2.2 支持java.time。java.sql.*
从哪里获得 java.time 类?
该ThreeTen-额外项目与其他类扩展java.time。该项目是未来可能添加到 java.time 的试验场。你可能在这里找到一些有用的类,比如Interval,YearWeek,YearQuarter,和更多。
如果您想要的只是一年中的一天,为什么不使用GregorianCalendars DAY_OF_YEAR字段呢?
import java.util.GregorianCalendar;
public class CalTest {
public static void main(String[] argv) {
GregorianCalendar gc = new GregorianCalendar();
gc.set(GregorianCalendar.DAY_OF_MONTH, 8);
gc.set(GregorianCalendar.MONTH, GregorianCalendar.JUNE);
gc.set(GregorianCalendar.YEAR, 2010);
System.out.println(gc.get(GregorianCalendar.DAY_OF_YEAR));
}
Run Code Online (Sandbox Code Playgroud)
}
或者,您可以计算今天的Julian日期与今年1月1日之间的差异.但是一定要在结果中添加1,因为1月1日不是一年中的第0天:
int[] now = {2010, 6, 8};
int[] janFirst = {2010, 1, 1};
double dayOfYear = toJulian(now) - toJulian(janFirst) + 1
System.out.println(Double.valueOf(dayOfYear).intValue());
Run Code Online (Sandbox Code Playgroud)
import java.util.Calendar;
// ...
final int julianDay = Calendar.getInstance().get(Calendar.DAY_OF_YEAR);
Run Code Online (Sandbox Code Playgroud)
请注意,这并未考虑您引用的奇怪网站声称的"中午开始"交易.只需检查当然的时间即可解决这个问题.
我已阅读所有帖子,但我认为有些内容不太清楚。
user912567提到了Jean Meeus,他说得绝对正确
我发现的最准确的定义是 Jean Meeus 在其“天文算法”一书中给出的(必须有,真的......)。
Julian Date 是一个日期,像往常一样表示,包含年、月和日。
儒略日是一个数字(实数),从 -4712 年开始计算,是“...连续的天数...”(以及天的分数)。用于精确天文计算的有用时间尺度。
Jean Meeus:“儒略日与儒略历无关”(《天文算法》,第 2 版,第 59 页)
| 归档时间: |
|
| 查看次数: |
38680 次 |
| 最近记录: |