日期月本地化

时间:2015-09-29 09:27:19

标签: java android date localization simpledateformat

我是这样的:

2015-09-18 12:24:16

我需要这个:

18 settembre (localized month string)

我试过这种方式:

private String formatDate(String dateString) {
        String formattedDate = "";
        Date date;
        final SimpleDateFormat sdf =
        new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());

        try {
            date = sdf.parse(dateString);
            sdf.applyPattern("dd MMMM");
            formattedDate = sdf.format(date);
        } catch (ParseException pe) {
            pe.printStackTrace();
        }

        return formattedDate;
    }

此代码有任何陷阱吗?可以简化吗? Locale.getDefault将始终获得正确的翻译?为什么applyPattern doc说:

"将此简单日期格式的模式更改为使用非本地化模式字符的指定模式。

4 个答案:

答案 0 :(得分:3)

std::string funcString = getFromDatabase (...) // Not really, but this is abstract
afunc::functions.at(funcString)(...) // at because the map is const, so it's even threadsafe

<强>输出:

SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d1 = parser.parse("2015-09-18 12:24:16");
SimpleDateFormat parser1 = new SimpleDateFormat("dd MMMM",new Locale ("it"));
System.out.println(parser1.format(d1));

答案 1 :(得分:0)

对于默认语言环境使用:locale.getDefault()。

SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d1 = null;
        try {
            d1 = parser.parse("2015-09-18 12:24:16");
        } catch (ParseException e) {
            e.printStackTrace();
        }
        SimpleDateFormat parser1 = new SimpleDateFormat("dd MMMM",Locale.getDefault());
        System.out.println(parser1.format(d1));

答案 2 :(得分:0)

你可以试试这个: -

Calendar calendar = Calendar.getInstance();
Date currDate = Util.getCurrentDate();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String date = formatter.format(calendar.getTime());

答案 3 :(得分:0)

是的,我看到两个主要问题。

  • 过时的课程
    旧的.Date / .Calendar课程非常麻烦。避免他们。
  • 时区
    日期因您所在的时区而异。

避免使用java.util.Date/.Calendar

避免使用旧的java.util.Date/.Calendar类。这是众所周知的混乱,麻烦和有缺陷。而是使用成功的Joda-Time库。在Java 8及更高版本中,使用了受Joda-Time启发的新内置java.time框架。

时区

如果精确度很重要,请应用时区。日期因您在地球上的位置而异。例如,巴黎的新一天比蒙特利尔早起。

理想情况下,您的输入字符串将包括从UTC和/或时区的偏移量。如果没有,您必须知道该区域。告诉解析器要使用的区域。

DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );

ISO 8601

根据ISO 8601,您的字符串几乎采用标准格式。默认情况下,Joda-Time使用这些标准格式。因此,如果我们用T替换中间的空格,则无需定义格式模式。

String input = "2015-09-18 12:24:16";
String inputStandard = input.replace( " " , "T" );
DateTime dateTime = new DateTime( inputStandard , zone );

要获得所需的字符串输出,请为所需的人类语言指定Locale

Locale locale = Locale.CANADA_FRENCH;

如果您想要JVM的当前默认值Locale,我建议您调用它来使您的代码自我记录和显式。

Locale locale = Locale.getDefault();

但请记住,当前默认值可随时通过JVM中任何应用程序中任何线程中的任何代码调用setDefault而发生变化。我建议指定Locale而不是依赖默认值。

formatter定义specifying a pattern。告诉格式化程序使用特定的Locale而不是JVM's current default

DateTimeFormatter formatter = DateTimeFormat.forPattern( "d MMMM" );
formatter = formatter.withLocale( locale );
String output = formatter.print( dateTime );

转储到控制台。

System.out.println( "input: " + input + " in zone: " + zone + " is: " + dateTime );
System.out.println( "In locale: " + locale + " = " + output );

跑步时。

input: 2015-09-18 12:24:16 in zone: America/Toronto is: 2015-09-18T12:24:16.000-04:00
In locale: fr_CA = 18 septembre

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore