使用区域设置将字符串转换为日期

时间:2014-06-25 10:34:31

标签: java date date-format

我的日期字符串为" 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);

如何获得预期结果。

3 个答案:

答案 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)

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功能都被反向移植到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。切勿使用诸如ESTIST之类的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的当前默认值。默认值可能会有所不同最好始终明确指定所需/预期的区域设置和所需/预期的时区。