tl;博士
LocalDateTime.parse( "2014-01-01 00:00:00".replace( " " , "T" ) ).atZone( ZoneId.of( "America/New_York" ) )
详情
问题和其他答案使用过时的遗留类。
java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了旧的麻烦的日期时间类,例如java.util.Date、.Calendar 和java.text.SimpleDateFormat。
现在在maintenance mode,Joda-Time 项目也建议迁移到 java.time。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。
大部分 java.time 功能在ThreeTen-Backport 中向后移植到Java 6 和7,并进一步适应ThreeTenABP 中的Android。
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。
LocalDateTime
您的输入字符串缺少有关从 UTC 偏移或时区的任何信息。所以我们必须解析为LocalDateTime对象。
为了解析,我们可以通过将中间的空格替换为T,使输入字符串严格符合ISO 8601标准格式。 java.time 类在解析/生成字符串时默认使用 ISO 8601 格式。所以不需要指定格式模式。
String input = "2014-01-01 00:00:00".replace( " " , "T" );
LocalDateTime ldt = LocalDateTime.parse( input );
现在为这个值分配一个时区。应用ZoneId 以获取ZonedDateTime 对象。
指定proper time zone name。切勿使用 3-4 个字母的缩写,例如 EST 或 IST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
EST 可能是指美国东海岸,America/New_York。
ZoneId zoneId = ZoneId.of( "America/New_York" );
ZonedDateTime zdt = ldt.atZone( zoneID );
地区与时区
这个问题的标题是指语言环境。
不要将其与时区混淆。时区是指与 UTC 的偏移加上一组用于处理该地区特定异常的规则,例如夏令时 (DST)。语言环境指定 (a) 用于翻译日期名称和月份名称的人类语言,以及 (b) 用于决定诸如小写/大写、缩写、标点符号和部分顺序等问题的文化规范。
时区和语言环境这两个问题是正交的、不同的和不相关的。您可以将法国语言环境用于印度时区,或将摩洛哥语言环境用于新西兰时区。时区影响数据的含义,而语言环境仅影响其作为字符串的表示。
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL );
f = f.withLocale( Locale.GERMANY );
String output = zdt.format( f );
如果同时使用区域设置和时区,如果省略,那么您的 JVM 的当前默认值将被隐式应用。该默认值可能会有所不同。最好始终明确指定您想要/预期的语言环境和您想要/预期的时区。