gpt4 book ai didi

date - 如何从 Java 8 Date API 中的回历日期中减去回历年份

转载 作者:行者123 更新时间:2023-12-02 07:43:47 25 4
gpt4 key购买 nike

我想显示 Ramadan 2017 年开始和结束日期。我尝试使用 HijrahChronology 编写代码内置于 Java 8 及更高版本中,带有 HijrahDate类。

import java.time.LocalDate;
import java.time.chrono.HijrahDate;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAdjusters;

public class Ramdan {

public static void main(String[] args) {

HijrahDate ramdanDate = HijrahDate.now().with(ChronoField.DAY_OF_MONTH, 1).with(ChronoField.MONTH_OF_YEAR, 9);

LocalDate ramdanStart = LocalDate.from(ramdanDate);
LocalDate ramdanEnd = LocalDate.from(ramdanDate.with(TemporalAdjusters.lastDayOfMonth()));

System.out.println("Ramdan 2017");
System.out.println(ramdanStart);
System.out.println(ramdanEnd);
}

}

但它显然打印出了当年的日期,即 2018 年。

Output

Ramdan 2017

2018-05-16

2018-06-14

我尝试了很多方法,例如减去年份,或进行时间调整,但没有任何帮助。有人可以建议一种很酷的方法来实现它吗?

最佳答案

我不确定这是否是完美的方法,但这对我有用,而且看起来并不太复杂:

    ramdanDate = ramdanDate.with(ChronoField.YEAR, ramdanDate.get(ChronoField.YEAR) - 1);

在转换为 LocalDate 之前插入此行后,您的代码现在将打印:

Ramdan 2017
2017-05-27
2017-06-24

编辑:

Suppose even if (in case you got a Gregorian year that overlaps with two instances of Ramadan, finding both) is desired...I cannot think of a way of achieving it. Can you suggest?

将舌头伸直放在嘴里:

public static void printRamdanDates(int gregorianYear) {
LocalDate gregDate = LocalDate.ofYearDay(gregorianYear, 1);
HijrahDate ramdanDate = HijrahDate.from(gregDate)
.with(ChronoField.DAY_OF_MONTH, 1)
.with(ChronoField.MONTH_OF_YEAR, 9);
LocalDate ramdanStart = LocalDate.from(ramdanDate);
LocalDate ramdanEnd = LocalDate.from(ramdanDate.with(TemporalAdjusters.lastDayOfMonth()));
// if in previous Gregorian year, skip
while (ramdanEnd.getYear() < gregorianYear) {
ramdanDate = ramdanDate.with(ChronoField.YEAR, ramdanDate.get(ChronoField.YEAR) + 1);
ramdanStart = LocalDate.from(ramdanEnd);
ramdanEnd = LocalDate.from(ramdanDate.with(TemporalAdjusters.lastDayOfMonth()));
}
if (ramdanStart.getYear() > gregorianYear) { // in following Gregorian year
System.out.println("No Ramdan in " + gregorianYear);
} else {
System.out.println("Ramdan " + gregorianYear);
do {
System.out.println(ramdanStart);
System.out.println(ramdanEnd);
ramdanDate = ramdanDate.with(ChronoField.YEAR, ramdanDate.get(ChronoField.YEAR) + 1);
ramdanStart = LocalDate.from(ramdanDate);
ramdanEnd = LocalDate.from(ramdanDate.with(TemporalAdjusters.lastDayOfMonth()));
} while (ramdanStart.getYear() == gregorianYear);
}
}

如果我将 2017 输入到上述方法中,它会给出与之前相同的结果:

    printRamdanDates(2017);

输出:

Ramdan 2017
2017-05-27
2017-06-24

但是尝试一下,例如 2000 年或 2030 年,当斋月在公历/ISO 年份发生两次时。

    printRamdanDates(2000);
printRamdanDates(2030);

输出:

Ramdan 2000
1999-12-09
2000-01-07
2000-11-27
2000-12-26
Ramdan 2030
2030-01-05
2030-02-03
2030-12-26
2031-01-23

关于date - 如何从 Java 8 Date API 中的回历日期中减去回历年份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51006760/

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