当前位置: 首页 > 知识库问答 >
问题:

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

解念
2023-03-14

见SO 15728744和SO 51058875。

以下内容如何正确:

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

我认为Hijri日在日落时结束,而不是午夜,所以应该需要一个gregorianDateTime。

共有2个答案

吕作人
2023-03-14

Java文档中提到LocalDate类不考虑时间。

参考:https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html

此类不存储或表示时间或时区。相反,它是日期的描述,用于生日。

考虑使用LocalDateTime满足您的需求。

何高歌
2023-03-14

你是对的,Hijri日历从前一个西天的日落开始。你说标准Java不支持它也是对的。

为什么?

我查了三十个旧档案,但什么也没找到。然而,java的主要开发者和架构师。时间——API曾在祖先约达时间的文件中陈述以下句子:

这个实现将一天定义为午夜到午夜,完全符合ISO年表。这一天的正确开始时间是前一天的日落时间,但这一点无法轻易建模,因此被忽略。

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

如何处理这种不足?

在标准Java的范围内,建议用户尽可能忽略一天中的时间。所以请记住,这样的转换是没有时间限制的抽象。当然,如果你想确定当天(这间接涉及到一天中的时间和民用时区),那么这种转换或多或少是错误的!

如果你不想忽视日落作为一天的开始...

... 然后你可以使用我的库Time4J(我不知道还有其他库可以处理日落作为一天的开始)。注意HijriCalendar类的文档。从瞬间/瞬间到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日历日期时间。在基于Chronoformator的格式化和解析过程中,也可以考虑日落时的开始时间。

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

HijriCalendar hcal = ...;
Moment m = 
  hcal.atTime(18, 45).in(Timezone.ofSystem(), StartOfDay.definedBy(meccaTime.sunset()));
 类似资料:
  • 我知道这个问题被问了很多次,但我没有找到正确的方法。我有一个日期,比如01-08-1994。我想把它转换成日期。使用。

  • 我想将Hijri日期转换为公历日期!我已经搜索过了,但不幸的是,我找到了一个将公历转换为Hijri的java类。我需要相反的。 HijriCalendar。爪哇:https://gist.github.com/fatfingers/6492017

  • 我想用C#将一个自定义的公历日期转换为波斯日期。例如,我有一个包含以下内容的字符串: 现在我想拥有: 串PersianDate=2 1392; 或 字符串PersianDate=1392/08/02 谢谢

  • 问题内容: 有谁可以帮助我吗 我正在尝试使用Swift语言创建IOS应用,并且我需要使用回历(伊斯兰)日历 我尝试了很多次,但失败了:( 这是我的尝试 并且输出错误 我们是在1434年的回历中,而不是2576年! 问题答案: 您正在混合日历,日期和组成部分: 您需要做的只是: 要获取格式化的字符串,而不仅仅是整数部分,您需要使用,这将允许您指定日历和日期以及格式。看这里。 更新资料 可以根据要求将

  • 问题内容: 我有一个日期时间格式的字段,当日期更好并且与数据库的其余部分更一致时,我想进行转换。无论如何,时间部分都是00:00:00。 如何在MySQL中做到这一点? 谢谢。 问题答案: 如果要在-Statement中使用,请使用运算符: 如果要在结构上更改表,只需将数据类型更改为(当然,只有在不影响依赖于此字段的应用程序的情况下,才这样做)。 两者都将消除时间部分。

  • 问题内容: 我想从公历转换为回历(伊斯兰)日期,并且我需要一个Java类来进行转换。我想以字符串“ yyyy / mm / dd”的形式给它一个公历日期,并以相同的格式给我回历日期。谁能帮我? 问题答案: 首先,将转换部分与格式/解析部分分开。您以后可以轻松处理这些问题-堆栈溢出问题 很多 。 就我个人而言,我会使用Joda Time,它通常会使生活简单得多。例如: (感觉应该有一种更干净的方式在