【问题标题】:Convert String into Date With Locale使用语言环境将字符串转换为日期
【发布时间】:2014-06-25 10:34:30
【问题描述】:

我有一个日期作为字符串,例如“2014-01-01 00:00:00”。我想将其转换为带有 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);

我怎样才能得到我的预期结果。

【问题讨论】:

    标签: java date date-format


    【解决方案1】:

    在调用parse之前,执行那个方法:

    formatter.setTimeZone(TimeZone.getTimeZone("EST"))
    

    【讨论】:

      【解决方案2】:
          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();
          }
      

      【讨论】:

      • 我希望返回一个日期对象而不是字符串。因为在那之后我必须将该日期转换为另一个时区。
      • 时间不同。我想要相同的时间,只有 IST 或 EST 不同。日期和时间应该相同。
      • 实际上时差会存在,因为你正在改变区域
      • 是的,但我不想......实际上在我的应用程序中,我们将从客户端获取日期字符串,然后我们将其转换为 GMT,所以基本上如果日期是“2014/04/21”并且客户端位于 EST 时区,则应根据该时区将日期转换为 GMT。
      • 你有点困惑,我认为这是同时转换为不同的区域时间值你想说什么我无法理解你能举个例子吗
      【解决方案3】:

      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.Calendarjava.text.SimpleDateFormat

      现在在maintenance modeJoda-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 个字母的缩写,例如 ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

      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 的当前默认值将被隐式应用。该默认值可能会有所不同。最好始终明确指定您想要/预期的语言环境和您想要/预期的时区。

      【讨论】:

        猜你喜欢
        • 2021-01-27
        • 1970-01-01
        • 2014-03-09
        • 2014-03-30
        • 2012-06-04
        • 1970-01-01
        • 2013-10-17
        • 1970-01-01
        • 2019-10-09
        相关资源
        最近更新 更多