我的日期字符串为" 2014-01-01 00:00:00"。我想将它转换为Date with EST Local,我的应用服务器是IST。
因此,当我打印日期时,我的预期输出将是" Wed Jan 01 00:00:00 EST 2014" 。
但结果是" Wed Jan 01 00:00:00 IST 2014" 。
以下是我的代码。
DateFormat formatter;
Date formattedDate = null;
formatter = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss", Locale.US);
try
{
formattedDate = formatter.parse("01-01-2014 00:00:00");
}
catch (ParseException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(formattedDate);
如何获得预期结果。
答案 0 :(得分:0)
在调用parse
之前,执行该方法:
formatter.setTimeZone(TimeZone.getTimeZone("EST"))
答案 1 :(得分:0)
Date date = new Date();
DateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z");
formatter.setTimeZone(TimeZone.getTimeZone("EST"));
String convertedDate = formatter.format(date);
System.out.println(formatter.format(date));
try {
Date date1 = formatter.parse(convertedDate);
System.out.println("IST : "+date1);
} catch (ParseException e) {
e.printStackTrace();
}
答案 2 :(得分:0)
LocalDateTime.parse( "2014-01-01 00:00:00".replace( " " , "T" ) ).atZone( ZoneId.of( "America/New_York" ) )
问题和其他答案使用过时的遗留类。
java.time框架内置于Java 8及更高版本中。这些类取代了旧的麻烦日期时间类,例如java.util.Date
,.Calendar
和& java.text.SimpleDateFormat
。
现在在maintenance mode中,Joda-Time项目还建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。
大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP。
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。
LocalDateTime
您的输入字符串缺少有关偏离UTC或时区的任何信息。所以我们必须解析为LocalDateTime
对象。
要解析,我们可以使输入字符串严格符合ISO 8601标准格式,方法是用T
替换中间的空格。在解析/生成字符串时,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。切勿使用诸如EST
或IST
之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
EST
或许你的意思是美国东海岸,America/New_York
。
ZoneId zoneId = ZoneId.of( "America/New_York" );
ZonedDateTime zdt = ldt.atZone( zoneID );
本课题的标题是指Locale。
不要将其与时区混淆。时区是指与UTC的偏移量加上一组规则,用于处理该区域的特定异常,例如夏令时(DST)。区域设置指定(a)用于翻译日期名称和月份名称的人类语言,以及(b)用于确定诸如小写/大写,缩写,标点符号和部分顺序等问题的文化规范。
时区和区域设置这两个问题是正交的,不同的和不相关的。您可以使用法语区域设置用于印度时区,或用于新西兰时区的摩洛哥语区域设置。时区影响数据的含义,而语言环境仅影响其呈现为String。
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL );
f = f.withLocale( Locale.GERMANY );
String output = zdt.format( f );
如果区域设置和时区都有,如果省略,那么将隐式应用JVM的当前默认值。默认值可能会有所不同最好始终明确指定所需/预期的区域设置和所需/预期的时区。