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

标签 java datetime localdate hijri

参见 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/

相关文章:

Java——界面设计

带延迟的 Java KeyListener

php - 在 PHP 中仅将年份转换为日期时间

java - java中基本数据格式转换

java - 根据给定的年龄找出人们的最小生日?

java - WeekFields 在 JVM 8 和 JVM 10 上的不同行为

java - Xamarin 中的 Android ParsePushBroadcastReceiver

java - 如何使用 Java 解码从 jsoup 中提取的图像 URL

macos - 在 mac bash 上格式化修改文件的日期/时间?

php - DateTime 对象不受其时间戳的约束?