Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于区域设置输出日时段_Java_Android_Simpledateformat - Fatal编程技术网

Java 基于区域设置输出日时段

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

我想格式化一个日期,它应该是本地化的,并且包括“天周期”

“日间”指的不是上午/下午,而是“下午”、“清晨”等

基于德国语言环境并启用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: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"