gpt4 book ai didi

java - 如何在没有时间的情况下将公历日期转换为伊斯兰(回历)日期?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:05:53 26 4
gpt4 key购买 nike

参见 SO 15728744SO 51058875 .

以下怎么可能是正确的:

LocalDate gregorianDate = LocalDate.parse(gregorianString, dateFormatter);
HijrahDate islamicDate = HijrahDate.from(gregorianDate);

我认为回历日结束于日落,而不是午夜,因此应该需要一个 gregorianDateTime。

最佳答案

你是对的,回历从前一个西方日的日落开始。您说标准 Java 不支持它也是正确的。

为什么?

我在旧的 Threeten 文件中搜索过,但一无所获。然而,java.time-API的主要开发者和架构师曾在documentation of the ancestor Joda-Time中表示以下句子:

This implementation defines a day as midnight to midnight exactly as per the ISO chronology. This correct start of day is at sunset on the previous day, however this cannot readily be modelled and has been ignored.

我的推测是:同样的动机也是为什么 java.time 在与伊斯兰历的转换中不考虑一天中的时间的原因。实现难度大主要是需要天文计算。

如何处理这个缺陷?

在标准Java范围内,建议用户尽量忽略时间。所以请记住,此类转换是无时间抽象。当然,如果你想确定当前日期(间接涉及一天中的时间和民用时区),那么这样的转换或多或少是错误的!

如果您不想将日落视为一天的开始...

...然后你可以使用我的图书馆Time4J (而且我不知道任何其他可以处理日落作为一天开始的库)。注意类的文档 HijriCalendar . generic conversion 的示例从片刻/瞬间到回历日期:

// the geographic location
SolarTime meccaTime = SolarTime.ofLocation(21.4225, 39.826111);
// or even simple: meccaTime = SolarTime.ofMecca()

// the moment to be converted
Moment now = SystemClock.currentTime();
// alternative using an explicit gregorian date:
// now = PlainDate.of(2019, 5, 26).atTime(18, 45).inStdTimezone();
// alternative using modern Java:
// now = Moment.from(Instant.now());
// alternative using outdated old API:
// java.util.Date instant = new java.util.Date();
// now = TemporalType.JAVA_UTIL_DATE.translate(instant);

// the conversion
HijriCalendar hcal = now.toGeneralTimestamp(
HijriCalendar.family(),
HijriCalendar.VARIANT_UMALQURA, // attention: there is no single islamic calendar
Timezone.ofSystem().getID(), // or use something like: ()-> "Europe/London"
StartOfDay.definedBy(meccaTime.sunset()));

Time4J 还包含一个格式引擎,它能够以多种方式解析公历日期或回历日期时间。在基于 ChronoFormatter 的格式化和解析过程中,也可以考虑日落时分的开始.

还支持从回历日期到时刻的反向转换。示例:

HijriCalendar hcal = ...;
Moment m =
hcal.atTime(18, 45).in(Timezone.ofSystem(), StartOfDay.definedBy(meccaTime.sunset()));

关于java - 如何在没有时间的情况下将公历日期转换为伊斯兰(回历)日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55783438/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com