如何在日本将英文日期格式化为ERA格式

3

我希望将新的日本ERA日期设置为"R010501",但是我得到的是"R151"。

我正在使用com.ibm.icu.text.DateFormat包来获取日期格式。


Date dtEngDate = new SimpleDateFormat("yyyy-MM-dd").parse("2019-05-01");

com.ibm.icu.util.Calendar japaneseCalendar = new com.ibm.icu.util.JapaneseCalendar();

        com.ibm.icu.text.DateFormat japaneseDateFormat = japaneseCalendar.getDateTimeFormat(
                 com.ibm.icu.text.DateFormat.SHORT, -1, Locale.JAPAN);      

        String today = japaneseDateFormat.format(dtEngDate);
System.out.println("today is:" +today.replaceAll("/", ""));

输出:今天是--> R151。 预期输出:今天是--> R010501


值得注意的是,例如java.util.Datejava.util.Calendarjava.text.SimpleDateFormat等日期时间类现已被java.time取代,并成为遗留系统。请参见Oracle的教程,了解更多信息。 - Basil Bourque
2个回答

1

java.time.chrono.JapaneseDate

你不需要外部依赖来使用日本日历。它已经内置在JapaneseDate类中。
注意:只有最新版本的Java才知道新的令和时代
    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("GGGGGyyMMdd", Locale.JAPANESE);
    LocalDate isoDate = LocalDate.parse("2019-05-01");
    JapaneseDate japaneseDate = JapaneseDate.from(isoDate);
    System.out.println(japaneseDate.format(dateFormatter));

这个Java 11.0.3代码片段的输出结果是:

R010501

五个模式字符G表示纪元的窄格式,只有一个字符(这里是R代表令和)。

在Java 9.0.4上,我得到了H310501。因此,如果您能升级Java,则似乎会正确工作。Meno Hochschild在评论中报告说他在Java 8u212上得到了正确的结果,因此,如果您只在主版本中获得了最新的次要升级,则可能不需要升级到新的主版本。我不知道是否有一种方法可以仅升级旧版Java中的日历数据,这可能是另一件要调查的事情。

顺便说一下,不要使用SimpleDateFormatDate。这些类设计不良(前者特别麻烦),而且已经过时很久了。请使用java.time,现代的Java日期和时间API。使用起来非常方便。

链接:Oracle教程:日期时间解释了如何使用java.time。


是的,即使在Java 8u212中也可以重现它,但国际化不足。例如:DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).withLocale(Locale.JAPANESE).format(japaneseDate)会产生"2019年5月1日",而正确和完整的本地化意味着这样(使用我的库Time4J作为例子):`ChronoFormatter.ofStyle(DisplayMode.FULL, Locale.JAPANESE, JapaneseCalendar.axis()).print( PlainDate.of(2019, 5, 1).transform(JapaneseCalendar.axis()) ) => "令和元年5月1日水曜日"(在Java 12或13中不容易实现,参见gannen年的用法)。 - Meno Hochschild
谢谢@MenoHochschild的深入评论。我仍然认为,当提问者要求“R010501”时,使用java.time不应该太难。否则,您的Time4J也是值得考虑的选择。 - Ole V.V.
1
公元元年只能通过使用旧类“SimpleDateFormat”在标准Java中打印。但是,使用“java.time”包需要手写传递给“DateTimeFormatterBuilder”的文本映射,这非常麻烦。日本人意识到这种限制,并不太热衷于“java.time.chrono”中的新日历。 - Meno Hochschild
我已经编辑好了,以便按照你的要求获取“R010501”。 - Ole V.V.
谢谢您的答复。但是,当我粘贴上面的代码时,仍然得到旧的纪元(即平成H)。我已经使用了以下软件包:java.time.LocalDate、java.time.chrono.JapaneseDate和java.time.format.DateTimeFormatter。如果我漏掉了什么,请告诉我。 - Amit Unakal
1
在Java 9.0.4上,我得到了“H310501”。在Java 11.0.3上,我得到了“R010501”。似乎只有更新的Java版本才“知道”新纪元。 - Ole V.V.

1
我不知道你除了我之外做了什么,但我刚刚从http://www.java2s.com/Code/Jar/c/Downloadcomibmicu442jar.htm下载了com.ibm.icu库,并基本上复制了你的代码。
import com.ibm.icu.text.DateFormat;
import com.ibm.icu.util.Calendar;
import com.ibm.icu.util.JapaneseCalendar;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class Main {

    public static void main(String[] args) throws ParseException {
        Date dtEngDate = new SimpleDateFormat("yyyy-MM-dd").parse("2019-05-01");
        Calendar japaneseCalendar = new JapaneseCalendar();
        DateFormat japaneseDateFormat = japaneseCalendar.getDateTimeFormat(DateFormat.SHORT, -1, Locale.JAPAN);
        String today = japaneseDateFormat.format(dtEngDate);
        System.out.println("today is: " + today.replaceAll("/", ""));
    }

}

我看到控制台输出了“今天是:平成310501”,我想这就是您要找的内容。所以我猜测您的“com.ibm.icu-4.4.2.jar”出现了问题。

也许您可以考虑重新从我使用的链接下载最新版本,并将其添加到模块/项目的依赖项中。


3
你好,Nicola。感谢你的回答。是的,月份如预期所至。但是,如果我使用你提到的JAR文件,时代名称“平成”不会改变。正如你所知,从2019年5月1日开始,日本将启用一个名为“令和”的新纪元。这些更改不包含在你分享的JAR文件中。只是提供信息,我已经使用了[链接](http://site.icu-project.org/download/64)上的JAR文件,其中包含了最新的更改。 - Amit Unakal
另外补充一点,我知道可以使用某些字符串函数来完成这个任务(但我不太想用)。但如果你/某人可以帮我通过DateFormat / SimpleDateFormat类获取此格式,则会很有帮助。 - Amit Unakal
呼.. 我没有意识到这个变化... 我会进一步深入探究。 - Nicola Uetz
我猜DateFormat没有办法解决这个问题。即使使用japaneseCalendar.get(JapaneseCalendar.YEAR);仍然会得到31而不是1,所以我真的不知道出了什么问题。我猜他们改变了他们的format函数,因此你最有可能需要使用字符串函数。我知道这不是那么优雅,但我真的看不到其他的解决方案。 - Nicola Uetz
谢谢。如果我有任何突破,我会更新的。 - Amit Unakal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接