我在 Java 中有一些字符串,格式为:Day Month Year Hour:Minute:Second
7 Jan 2010 23:00:00.000
4 Feb 2010 17:40:00.000
解析此字符串并将值转换为其结果 Julian Dates 的最简单方法是什么?我正在从 Excel 中读取这些字符串,因此它们不是具有任何转换 / 格式化实用程序(只是原始字符串)的对象。是否有一个简单的库或函数调用来转换这些,或者我必须手动编写解析器?谢谢
我的库Time4J支持Julian Dates开箱即用。
ChronoFormatter<PlainTimestamp> f =
ChronoFormatter.ofTimestampPattern(
"d MMM uuuu HH:mm:ss.SSS", PatternType.CLDR, Locale.ENGLISH);
Moment j2000 = f.p("7 Jan 2010 23:00:00.000").atUTC(); // are your timestamps really UTC?
// eventually also: ".in(Timezone.ofSystem());"
System.out.println(JulianDay.ofSimplifiedTime(j2000)); // programmer's standard
// JD(POSIX)2455204.4583333335
System.out.println(JulianDay.ofEphemerisTime(j2000)); // astronomical definition
// JD(TT)2455204.459099352
优势:
没有复杂的计算你的拥有。
支持时间尺度 TT 上的天文定义。
显式显示时区依赖关系(无论您选择什么)。
java.时间
当然,Java 有一个内置的日期和时间解析器,DateTimeFormatter
类(之所以这样命名,是因为它也可以将日期和时间格式化为字符串)。还有许多类可以利用它来生成自己的对象。在您的情况下,您需要LocalDateTime
类。LocalDateTime
是一天中的日期和时间,没有时区或与 UTC 数据的偏移量,因此适合保存。
这个格式化程序对你的字符串有好处:
private static final DateTimeFormatter FORMATTER
= DateTimeFormatter.ofPattern("d MMM uuuu HH:mm:ss.SSS", Locale.ENGLISH);
编辑:您在评论中写道:
将 Jan 7 2010 小时 23 插入此计算器:aavso.org/jd-calculator返回 2455204.45833。这会是确切的 Julian Date 吗?我相信你的解决方案是给 Day 而不是 Date 十进制值
是的,这是完全正确的。修改后的代码以获取包括分数的 julian 日期是:
String source = "7 Jan 2010 23:00:00.000";
LocalDateTime ldt = LocalDateTime.p(source, FORMATTER);
// Subtract half a day to compensate for the
// fact that the Julian day begins at noon
LocalDateTime dateToUseForJulianDay = ldt.minusHours(12);
long julianDayNumber = dateToUseForJulianDay.getLong(JulianFields.JULIAN_DAY);
double juianDateFraction = (double) dateToUseForJulianDay.getLong(ChronoField.NANO_OF_DAY)
/ (double) Duration.ofDays(1).toNanos();
double julianDate = julianDayNumber + juianDateFraction;
System.out.println("Julian date: " + julianDate);
和输出是在这个例子中:
朱利安日期:2455204.4583333335
它与您从在线计算器中引用的结果非常吻合。
Julian day number 是自公元前 4713 年 1 月 1 日以来的日编号。Julian day 从中午开始,Java 没有考虑到这一点,因此作为黑客,我减去了 12 个小时以补偿并获得一天中所有时间的正确日期。由于getLong()
方法仅将 Julian 日编号作为整数,因此我需要分别找到分数。从每天的纳秒数减去
更多链接:上的Julian day
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(58条)