Java中的Julian日

Mar*_*ark 16 java julian-date

我在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)


Bas*_*que 8

tl;博士

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.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.timejava.sql.*

从哪里获得 java.time 类?

ThreeTen-额外项目与其他类扩展java.time。该项目是未来可能添加到 java.time 的试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多


wal*_*orn 7

如果您想要的只是一年中的一天,为什么不使用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)


Poi*_*nty 6

import java.util.Calendar;
// ...
final int julianDay = Calendar.getInstance().get(Calendar.DAY_OF_YEAR);
Run Code Online (Sandbox Code Playgroud)

请注意,这并未考虑您引用的奇怪网站声称的"中午开始"交易.只需检查当然的时间即可解决这个问题.

  • "Julian Date"或"Julian Day"一直对我来说是一年中的一天.我认为除了严肃的古典学者之外,每个人都是如此.如果某人正在寻找由格列高利历前计算的日期,我的解决方案将无效.请注意,问题包括句子"我需要今年的那一天". (2认同)
  • 另请注意,最初的问题是2010年6月8日应该是"159",如果"朱利安日"仅仅意味着"一年中的某一天",这是正确的. (2认同)

ben*_*deg 5

我已阅读所有帖子,但我认为有些内容不太清楚。

user912567提到了Jean Meeus,他说得绝对正确

我发现的最准确的定义是 Jean Meeus 在其“天文算法”一书中给出的(必须有,真的......)。

Julian Date 是一个日期,像往常一样表示,包含年、月和日。

儒略日是一个数字(实数),从 -4712 年开始计算,是“...连续的天数...”(以及天的分数)。用于精确天文计算的有用时间尺度。

Jean Meeus:“儒略日与儒略历无关”(《天文算法》,第 2 版,第 59 页)