问题
您的代码出现了多个问题。
时区
一个问题是您在不处理时区的情况下进行本地化。解析将应用 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