【问题标题】:What's a I18N-friendly way to show a date range?显示日期范围的 I18N 友好方式是什么?
【发布时间】:2012-05-04 13:09:32
【问题描述】:

我显示日期范围如下:

public static void main(String[] args) {
    Locale.setDefault(new Locale("nl", "NL"));

    DateTime d1 = new DateTime();
    DateTime d2 = new DateTime().plusDays(30);

    final String s1 = d1.toString(DateTimeFormat.shortDate());
    final String s2 = d2.toString(DateTimeFormat.shortDate());

    System.out.println(s1 + "-" + s2); // shows  "4/05/12-3/06/12" for en_AU
    System.out.println(s1 + "-" + s2); // shows  "4-5-12-3-6-12" for nl_NL
}

对于荷兰的用户,他们会看到“4-5-12-3-6-12”。这令人困惑。

有什么方法可以显示考虑到用户区域设置的日期范围?

【问题讨论】:

  • 我不知道 4/5/12 是 5 月 4 日还是 4 月 5 日。 2012 年 5 月 4 日至 2012 年 6 月 3 日怎么样?月份缩写将取决于语言环境。

标签: java internationalization jodatime


【解决方案1】:

在本地化应用程序中,这种分离将由翻译人员在翻译您的资源包时决定:

#foo.properties
#comment: a date range
dateRange={0,date}-{1,date}

可能变成:

#foo_en.properties
dateRange={0,date} to {1,date}

这可以使用MessageFormat 类型来处理。某种形式的东西:

//untested code
MessageFormat mf = new MessageFormat(formatString, locale);
//java.util.Date instances
Object[] range = {date1, date2};
String result = mf.format(range);

即使您没有提供完整的翻译,这种方法也可能适用于某些本地化。

【讨论】:

  • 我想我真的知道这是正确的答案,但我懒惰的一面希望它不是。好吧,该应用程序完全可以使用资源包进行翻译,所以这将是要走的路。
【解决方案2】:

也许使用省略号 (...) 而不是破折号?

【讨论】:

    【解决方案3】:

    至少在值周围使用更多空间:

    "4-5-12 - 3-6-12"
    

    4 位数字在每个地区都是可以理解的:

    "4-5-2012 - 3-6-2012"
    

    固定位数可能符合您的口味,也可能不符合您的口味:

    "04-05-2012 - 03-06-2012"
    

    我没有看到从第 2 到第 3 形式的改进,但到第 2 形式,有。我们都经常接触较小的数字而不是较大的数字,而且较小的数字很少。 11、12 和 13 经常穿过你的路,但如果你看到 2011、2012 和 2013 年,那几年以来,它主要是日期。

    【讨论】:

    • 另请注意,国际日期格式为年-月-日,以避免混淆月份和日期的顺序。
    • @Sprachprofi:有类似国际日期格式的东西吗?它在哪里定义?从其他范围来看,有许多国际测量,称为公制,尤其是美国不符合 - 参见英寸、加仑、磅、英尺、码、英里,...... - 并且:“考虑到用户的语言环境" 是问题的一部分。
    • ISO 有一些显示日期的标准,例如 YYYY-MM-DD 格式。但总的来说,我的用户会喜欢以他们习惯的格式查看日期。
    【解决方案4】:

    你可以使用:

    SimpleDateFormat sdf;
    
    // Create new SimpleDateFormat object that returns default pattern.
    sdf = new SimpleDateFormat();
    String dateFormat = sdf.format(date);
    System.out.println("Date by SimpleDateFormat class : " + dateFormat);
    

    输出是:

    SimpleDateFormat 类的日期:2008 年 6 月 14 日下午 1:15

    【讨论】:

      猜你喜欢
      • 2013-09-18
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多