如何实施波斯日历

How to implement Persian Calendar

JavaFx 上是否有任何波斯历 DatePicker 的实现?

没有波斯语chronology可以在DatePicker上使用来实现波斯语日历

如文档中所述,您可以通过 DatePickerObjectProperty<Chronology> 设置使用的日历系统。 您需要这样做的方法是

public final void setChronology(Chronology value)

由于没有实现默认的 persian/iranian 日历系统(仅实现了 hiraj 系统),您必须自己编写:

"添加新日历 可用的年表集可以通过应用程序进行扩展。添加新的日历系统需要编写 Chronology、ChronoLocalDate 和 Era 的实现。特定于日历系统的大部分逻辑将在 ChronoLocalDate 实现中。 Chronology 实现充当工厂。

为了允许发现额外的年表,使用了 ServiceLoader。必须将一个文件添加到 META-INF/services 目录,名称 'java.time.chrono.Chronology' 列出实现 类。有关服务加载的更多详细信息,请参阅 ServiceLoader。对于通过 id 或 calendarType 查找,首先找到系统提供的日历,然后是应用程序提供的日历。

每个编年表必须定义一个在系统内唯一的编年表 ID。如果年表表示由 CLDR 规范定义的日历系统,则日历类型是 CLDR 类型和 CLDR 变体(如果适用)的串联,

实施要求: 必须谨慎实施此接口,以确保其他 类 正常运行。所有可以实例化的实现都必须是最终的、不可变的和线程安全的。 Sub类 应该尽可能是可序列化的。” 资料来源:https://docs.oracle.com/javase/8/docs/api/java/time/chrono/Chronology.html?is-external=true

我现在开发了一个 ready-to-use 日历选择器,它还提供波斯日历。它最初的灵感来自 Christian Schudt 的出色作品,但经过完全重写和增强。只需下载我的图书馆 Time4J-v4.20 (or later, available in Maven) and use this code demo:

CalendarPicker<PersianCalendar> picker = picker.persianWithSystemDefaults();

picker.setLengthOfAnimations(Duration.seconds(0.7));
picker.setShowInfoLabel(true);
picker.setLocale(new Locale("fa", "IR"));
picker.setShowWeeks(true);

picker.setCellCustomizer(
  (cell, column, row, model, date) -> {
    if (CellCustomizer.isWeekend(column, model)) {
      cell.setStyle("-fx-background-color: #FFE0E0;");
      cell.setDisable(true);
    }
  }
);

您还可以设置其他属性,例如最小和最大日期。这里有一个使用波斯语的示例图像和伊朗的本地化周模型。您可以浏览所有波斯语月份、年份或十年(通过单击 header)或跳转到当前日期(通过单击页脚)。