Java 如何在没有时间的情况下将公历日期转换为伊斯兰(Hijri)日期?
见和 以下内容如何正确:Java 如何在没有时间的情况下将公历日期转换为伊斯兰(Hijri)日期?,java,datetime,localdate,hijri,Java,Datetime,Localdate,Hijri,见和 以下内容如何正确: LocalDate-gregorianDate=LocalDate.parse(gregorianString,dateFormatter); HijrahDate islamicDate=HijrahDate.from(gregorianDate); 我认为,日暮日是日落,不是午夜,所以应该有一个GRGGORIDENATE时间。 < P>在java文档中提到,LooDead类不考虑时间。 参考: 此类不存储或表示时间或时间 时区。相反,它是对日期的描述,用于 生日
LocalDate-gregorianDate=LocalDate.parse(gregorianString,dateFormatter);
HijrahDate islamicDate=HijrahDate.from(gregorianDate);
<>我认为,日暮日是日落,不是午夜,所以应该有一个GRGGORIDENATE时间。 < P>在java文档中提到,LooDead类不考虑时间。 参考: 此类不存储或表示时间或时间 时区。相反,它是对日期的描述,用于 生日
考虑根据您的要求使用LocalDateTime。您是对的,Hijri日历在前一个西方日的日落时开始。您也可以说标准Java不支持它 为什么? 我翻了三十个旧档案,但什么也没找到。然而,
java.time
-API的主要开发人员和架构师曾在下面一句话中指出:
此实现将一天定义为午夜到午夜,与
按照ISO年表。一天的正确开始是在太阳落山的时候
然而,前一天,这无法轻易建模,并且已经
忽略
我的猜测是:同样的动机也是为什么java.time
在与伊斯兰日历的转换中不考虑一天中的时间的原因。它很难实现,主要是因为它需要天文计算
如何处理这一缺陷?
在标准Java的范围内,建议用户尽可能忽略一天中的时间。所以请记住,这种转换是无时间限制的抽象。当然,如果您想确定当前日期(这间接涉及到一天中的时间和民用时区),那么这种转换或多或少是错误的
如果您不想忽略日落作为一天的开始…
。。。然后您可以使用我的库(我不知道还有其他库可以处理日落作为一天的开始)。注意课堂上的文档。从瞬间/瞬间到Hijri日历日期的示例:
// 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还包含一个格式引擎,它能够以多种方式解析公历日期或Hijri日历日期时间。在基于的格式设置和解析过程中,也可以考虑日落时的开始时间
还支持从Hijri日历日期到时刻的反向转换。例如:
HijriCalendar hcal = ...;
Moment m =
hcal.atTime(18, 45).in(Timezone.ofSystem(), StartOfDay.definedBy(meccaTime.sunset()));
它只是告诉你一般哪个日期是同一个日期。如果你想要精确,你需要的不仅仅是当地的日期和时间——你还需要日落的时间,这意味着你需要精确的即时和地理位置。日历上没有普遍的协议,因此Java选择了沙特官方日历,并允许一些选项。关于日落,也可以采取类似的解决办法。欧洲的一些穆斯林使用沙特的日落时间,一些使用当地的日落时间。@JonathanRosene似乎你的评论是你自己的答案。但这不是Java实现它的方式。这正是我的观点。如果没有时间,就不可能在回历和公历之间转换。我理解你的意思。但对于不同的时区,你可以指出同样的事情。考虑到它是印度的21/04/2019,它不一定意味着它是芝加哥的21/04/2019,因为它也可以是20/04/2019。但是LoalDead类不考虑任何时间,它只考虑绝对日期。因此,时间在这里并不重要。因此,如果我将问题改为使用ZoneDate,这适用于您提到的情况,会有帮助吗?