Java 基于区域设置输出日时段
我想格式化一个日期,它应该是本地化的,并且包括“天周期” “日间”指的不是上午/下午,而是“下午”、“清晨”等 基于德国语言环境并启用12小时设置的格式化日期应类似于Java 基于区域设置输出日时段,java,android,simpledateformat,Java,Android,Simpledateformat,我想格式化一个日期,它应该是本地化的,并且包括“天周期” “日间”指的不是上午/下午,而是“下午”、“清晨”等 基于德国语言环境并启用12小时设置的格式化日期应类似于03.08.18,9:01 abends,“abends”表示晚上 同样的例子应该是西班牙语的3/8/18 9:01 de la noche。 为什么我认为这是可能的: 答:因为WhatsApp Android应用程序的日期格式是这样的 B:因为Java 10源代码包含以下内容(来自德语翻译文件): 输出:08.12.18 7:2
03.08.18,9:01 abends
,“abends”表示晚上
同样的例子应该是西班牙语的3/8/18 9:01 de la noche
。
为什么我认为这是可能的: 答:因为WhatsApp Android应用程序的日期格式是这样的 B:因为Java 10源代码包含以下内容(来自德语翻译文件): 输出:
08.12.18 7:24 nachm
或8/12/18 7:54 p。m、
以下代码具有相同的输出:
DateFormat abc = SimpleDateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, current);
abc.format(System.currentTimeMillis());
我还尝试了
DateTimeFormatterBuilder
(使用了所有的AMPM-of-DAY版本):
输出:8dic。2018年19:54。m、 p.m.p.m.11
有什么方法可以这样输出日期吗
谢谢只有两个库支持日间时段,即ICU4J(部分并入Android)和my lib Time4A。其他格式化程序,如
java.text.DateFormat
或java.time.format.DateTimeFormatter
不支持
德语区域设置的示例(这里有一个到老式类型java.util.Date
)的桥接):
如果您不同意这些数据,那么您可以通过构建自己的自定义格式化程序
关于ICU4J的注意事项:我没有测试该库,但它的类com.ibm.icu.text.SimpleDataFormat
也支持模式符号B(但是javadoc已经过时)
另一项说明:
如果您喜欢基于样式的格式,而不指定具体模式,则可以使用日期和时间部分的组合:
Locale loc = Locale.US;
// our concrete values to be formatted
Moment moment = SystemClock.currentMoment();
PlainDate calendarDate = moment.toLocalTimestamp().getCalendarDate();
// get the localized clock pattern
Map<String, String> textForms = CalendarText.getIsoInstance(loc).getTextForms();
String pattern =
textForms.containsKey("F_Bhm") ? textForms.get("F_Bhm") : "h:mm B";
// construct the style-based date formatter
ChronoFormatter<PlainDate> f1 =
ChronoFormatter.ofDateStyle(DisplayMode.SHORT, loc);
// construct the time formatter
ChronoFormatter<Moment> f2 = ChronoFormatter.ofMomentPattern(
pattern,
PatternType.CLDR,
loc,
Timezone.ofSystem().getID());
System.out.println(f1.format(calendarDate) + " " + f2.format(moment));
// example output => "12/11/18 6:18 in the morning"
Locale loc=Locale.US;
//我们的具体价值观有待形成
力矩=系统时钟。当前力矩();
PlainDate calendarDate=moment.toLocalTimestamp().getCalendarDate();
//获取本地化的时钟模式
Map-textForms=CalendarText.getIsoInstance(loc.getTextForms();
字符串模式=
textForms.containsKey(“F_Bhm”)?textForms.get(“F_Bhm”):“h:mmb”;
//构造基于样式的日期格式化程序
计时表f1=
日期样式的计时格式(DisplayMode.SHORT,loc);
//构造时间格式化程序
计时器f2=计时器模式的计时器(
图案
PatternType.CLDR,
loc,
Timezone.ofSystem().getID());
System.out.println(f1.格式(日历日期)+“”+f2.格式(时刻));
//示例输出=>“2018年11月12日上午6:18”
一个基本问题可能是不同的文化对一天的划分不同,因此没有直接翻译。你已经在AM和PM中得到了一些,这在德语中没有使用。我不知道这是什么,但我想地中海沿岸的人们会期待一天中的“午睡”时间,而这并不在你的清单中。诸如此类。你当然应该更喜欢现代的DateTimeFormatter
,而不是麻烦的老式SimpleDateFormat
@OleV.V。谢谢你的想法。是的,这是个问题。我想知道WhatsApp是怎么做的。我认为他们只是使用了正确的java日期格式化程序或一些小技巧,因为所有必要的信息都在java源代码中。指定时段。LDML是java用于本地的规范这是否回答了您的问题?这已经很有帮助了。是否有任何方法可以像DateUtils.formatDateTime
输出那样获取日期和时间模式?SimpleDateFormat和您的示例缺少“,”(`12.12.2018,1:13 nachm.`),很遗憾,我需要基于区域设置(有些区域设置包括它,有些不包括)。@Nick我理解您对结合日期和时间模式的本地化文本的渴望。不幸的是,Time4J/A还不支持它。但是我已经打开了一个跟踪任何建议/提议的窗口。欢迎你的建议。实事求是地说,由于复杂性,2019年春季之前不会出现最终解决方案。
DateFormat abc = SimpleDateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, current);
abc.format(System.currentTimeMillis());
DateTimeFormatter test = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM, FormatStyle.SHORT);
DateTimeFormatter fmt = new DateTimeFormatterBuilder()
.append(test)
.appendText(ChronoField.AMPM_OF_DAY, TextStyle.SHORT)
.appendText(ChronoField.AMPM_OF_DAY, TextStyle.NARROW)
.appendText(ChronoField.AMPM_OF_DAY, TextStyle.FULL)
.appendText(ChronoField.AMPM_OF_DAY, TextStyle.FULL_STANDALONE)
.toFormatter(current);
ZonedDateTime date = ZonedDateTime.now();
date.format(fmt);
ChronoFormatter<java.util.Date> f =
ChronoFormatter.ofPattern(
"dd.MM.uuuu, h:mm BBBB",
PatternType.CLDR,
Locale.GERMAN,
Moment.axis(TemporalType.JAVA_UTIL_DATE))
.withStdTimezone();
System.out.println(f.format(new java.util.Date()));
# day-period-rules
T0000=night1
T0500=morning1
T1000=morning2
T1200=afternoon1
T1300=afternoon2
T1800=evening1
# day-period-translations
P(a)_morning1=morgens
P(a)_morning2=vormittags
P(a)_afternoon1=mittags
P(a)_afternoon2=nachmittags
P(a)_evening1=abends
P(a)_night1=nachts
Locale loc = Locale.US;
// our concrete values to be formatted
Moment moment = SystemClock.currentMoment();
PlainDate calendarDate = moment.toLocalTimestamp().getCalendarDate();
// get the localized clock pattern
Map<String, String> textForms = CalendarText.getIsoInstance(loc).getTextForms();
String pattern =
textForms.containsKey("F_Bhm") ? textForms.get("F_Bhm") : "h:mm B";
// construct the style-based date formatter
ChronoFormatter<PlainDate> f1 =
ChronoFormatter.ofDateStyle(DisplayMode.SHORT, loc);
// construct the time formatter
ChronoFormatter<Moment> f2 = ChronoFormatter.ofMomentPattern(
pattern,
PatternType.CLDR,
loc,
Timezone.ofSystem().getID());
System.out.println(f1.format(calendarDate) + " " + f2.format(moment));
// example output => "12/11/18 6:18 in the morning"