1

我有一个必须本地化的日期。下面的代码返回5/1/12 19:06:34但我想要的结果是05/01/12 19:06:34 你能告诉我如何管理这个。

  private String localizeDate(String date){ //Format is 2012-05-01 19:30:49

    Locale loc = DataContextHolder.getDataContext().getLocale();
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", loc);

    Date parsed=null;
    try {
        parsed = formatter.parse(date);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, loc);

    String localizedDate = df.format(parsed) + " " + date.substring(11, 13) + ":"
            + date.substring(14, 16) + ":"
            + date.substring(17, 19);

    return localizedDate;
}
4

3 回答 3

3

您可以通过减少该特定元素的连续模式字母的数量来避免前导零。连续的多个模式字母告诉日期格式化程序,您至少希望有那么多字符来表达该值。

在您的示例中,以下内容应该可以解决您的问题。

new SimpleDateFormat("y-M-d H:m:s", loc);

SimpleDateFormat文档中查找更多信息。

为清楚起见,请参阅以下示例。

SimpleDateFormat a = new SimpleDateFormat("yyyyy-MMMM-dddd HHH:mmmm:sssss");
SimpleDateFormat b = new SimpleDateFormat("y-M-d H:m:s");

System.out.println(a.format(new Date())); 
// Prints 02012-June-0005 012:0027:00026
System.out.println(b.format(new Date()));
// Prints 12-6-5 12:27:26
于 2012-06-05T16:25:15.543 回答
2

问题

您的代码出现了多个问题。

时区

一个问题是您在不处理时区的情况下进行本地化。解析将应用 JVM 的默认时区。这意味着在具有不同时区设置的不同计算机上运行会产生不同的结果。通常最好指定一个时区而不是依赖默认值。

格式化,而不是本地化

另一个问题是,如果您真正进行本地化,您将不会指定格式的详细信息。您将让语言环境驱动格式化,无论适合该语言环境和用户自己的本地化设置。

避免使用 java.util.Date

另一个问题是您正在使用与 Java 捆绑在一起的 java.util.Date 类。该类及其兄弟 java.util.Calendar 是出了名的麻烦。避开他们。使用Joda-Time框架或 Java 8 中的新java.time.* 包

ISO 8601

您的输入字符串非常接近标准ISO 8601格式,如下所示:2014-02-07T07:06:41+03:00. 您的文本只是缺少T中间的 a 和时区偏移量。

Joda-Time框架默认使用ISO 8601。所以用“T”替换那个空格可以让你将字符串直接传递给DateTime构造函数。不需要格式化程序和解析,因为DateTime 构造函数会自动为您完成这项工作。

请注意,包括或省略从字符串输入末尾开始的时区偏移会改变构造 DateTime 的行为。如果没有偏移量,则字符串被解析为好像它发生在传递的时区内的指定时间(第二个参数,请参见下面的代码示例)。另一方面,如果您输入中包含偏移量,则字符串会被解析为好像它发生在偏移量位置的指定时间,然后将时间调整为传递的时区参数。

Joda-Time 示例

这是 Joda-Time 2.3 中的一些示例代码。

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Istanbul" );

String inputOriginal = "2012-05-01 19:30:49";
String input = inputOriginal.replace( " ", "T" );

DateTime dateTime = new DateTime( input, timeZone );
// Or if your input is UTC/GMT (no time zone offset), pass a predefined DateTimeZone constant.
//DateTime dateTime = new DateTime( input, DateTimeZone.UTC );

我们手头有我们的日期时间值。现在我们继续从该日期时间生成格式化字符串。我们通过使用 Joda-Time 的Locale敏感格式化工具来做到这一点。请注意,不仅格式已本地化,月份和日期名称的文本也已本地化为适当的语言。

// Create a formatter from a two-character style pattern.
// The first character is the date style, and the second character is the time style. 
// Specify a character of 'S' for short style, 'M' for medium, 'L' for long, and 'F' for full. 
// A date or time may be ommitted by specifying a style character '-'. 
java.util.Locale locale = new java.util.Locale( "tr", "TR" ); // Turkey chosen as an example.
String output_ShortShort = DateTimeFormat.forStyle( "SS" ).withLocale( locale ).print( dateTime );
String output_LongShort = DateTimeFormat.forStyle( "LS" ).withLocale( locale ).print( dateTime );

转储到控制台...</p>

System.out.println( "input: " + input );
System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTime in UTC/GMT: " + dateTime.toDateTime( DateTimeZone.UTC ) );
System.out.println( "output_ShortShort: " + output_ShortShort );
System.out.println( "output_LongShort: " + output_LongShort );

运行时……</p>

input: 2012-05-01T19:30:49
dateTime: 2012-05-01T19:30:49.000+03:00
dateTime in UTC/GMT: 2012-05-01T16:30:49.000Z
output_ShortShort: 01.05.2012 19:30
output_LongShort: 01 Mayıs 2012 Salı 19:30
于 2014-02-07T11:16:50.310 回答
0

您需要选择适当的日期格式化程序。请在此处阅读文档:

http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

于 2012-06-05T16:22:56.823 回答