【问题标题】:Java date parsing not working for ET timezone while working for IST为 IST 工作时,Java 日期解析不适用于 ET 时区
【发布时间】:2018-10-02 10:13:15
【问题描述】:

我正在尝试解析迄今为止的字符串。日期格式为的字符串 "dd-MMM-yyyy Z" 和具有值 "12-DEC-2018 ET" 的字符串。它给出了错误 java.text.ParseException:无法解析的日期:“12-DEC-2018 ET”。

相同的代码适用于值为“12-DEC-2018 IST”的字符串。 下面是代码sn-p:

public static void main(String[] args) throws ParseException {

    String dateInputIST ="12-DEC-2018 IST";
    String dateInputET ="12-DEC-2018 ET";

    SimpleDateFormat sdfmt1 = new SimpleDateFormat("dd-MMM-yyyy Z");
    SimpleDateFormat sdfmt2= new SimpleDateFormat("dd/MM/yyyy");

    Date dDate = sdfmt1.parse( dateInputIST );
    String strOutput = sdfmt2.format( dDate );

    System.out.println(strOutput);

    Date etDate = sdfmt1.parse(dateInputET);
    strOutput = sdfmt2.format(etDate);

    System.out.println(strOutput);

}

有人可以帮忙吗?我需要解析任何时区的时间。 谢谢, 纳文

【问题讨论】:

  • 你的意思是EDT而不是ET
  • 时区缩写的解析在任何情况下都是脆弱的。我至少不知道IST 是否会被解析为冰岛、爱尔兰、以色列或印度的时间。因此,如果可以的话,请避免依赖它们。此外,当东部时间是在标准时间和 EDT dirung 夏季使用 EST 正确指定时区时。
  • 我建议你避免使用SimpleDateFormat 类。它不仅过时了,而且出了名的麻烦。今天我们在java.time, the modern Java date and time API 中做得更好。
  • 在我的计算机上,您的程序将您的 IST 字符串解析为 Tue Dec 11 23:00:00 CET 2018,其格式为 11/12/2018。日期提前一天是预期行为吗?
  • @navin kumar :有任何答案对你有用吗?如果是,请考虑接受/支持他们。 What should I do when someone answers my question?

标签: java date timezone date-parsing


【解决方案1】:

改变

 String dateInputET ="12-DEC-2018 ET";

 String dateInputET ="12-DEC-2018 EDT";

“ET”不是公认的时区。

【讨论】:

    【解决方案2】:

    伪区域

    ET、EST 和 IST 实际上并不是时区。那些 2-4 个字母的伪区域不标准化,甚至不是唯一的!例如,IST 可以表示印度标准时间、爱尔兰标准时间、冰岛标准时间等。

    实时时区名称采用Continent/Region 的格式,例如Africa/Tunis

    日期和区域,分别

    带有时区的日期没有实际意义。

    将日期作为LocalDate 对象处理。

    String input = "12-DEC-2018"
    DayeTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" , Locale.US ) ;
    LocalDate ld = LocalDate.parse( input , f ) ;
    

    单独处理您想要的时区,作为ZoneId 对象。

    ZoneId zNewYork = ZoneId.of( "America/New_York" ) ; 
    

    要结合,请确定一天中的第一个时刻。

    ZonedDateTime zdtNewYork = ld.atStartOfDay( z ) ;
    

    以标准 ISO 8601 格式生成表示该时刻的文本,扩展为在方括号中附加时区名称。

    要在 UTC 中查看同一时刻,请提取 Instant

    Instant instant = zdtNewYork.toInstant() ;
    

    调整到另一个区域。

    ZonedDateTime zdtKolkata = instant.atZone( ZoneId.of( "Asia/Kolkata" ) ) ;
    

    要仅关注日期,请通过印度使用的挂钟时间镜头查看同一时刻的当天LocalDate

    LocalDate ldKolkata = zdtKolkata.toLocalDate() ;
    

    关于java.time

    java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

    Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

    要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

    您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

    从哪里获得 java.time 类?

    ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

    【讨论】:

      【解决方案3】:

      java.time

          DateTimeFormatter dateZoneFormatter = new DateTimeFormatterBuilder()
                  .parseCaseInsensitive()
                  .appendPattern("dd-MMM-uuuu v")
                  .toFormatter(Locale.ENGLISH);
      
          String dateInputIST ="12-DEC-2018 IST";
          String dateInputET ="12-DEC-2018 ET";
      
          TemporalAccessor parsed = dateZoneFormatter.parse(dateInputIST);
          System.out.println("Date: " + LocalDate.from(parsed) + " Time zone: " + ZoneId.from(parsed));
      
          parsed = dateZoneFormatter.parse(dateInputET);
          System.out.println("Date: " + LocalDate.from(parsed) + " Time zone: " + ZoneId.from(parsed));
      

      在我的电脑上,这个 sn-p 的输出是:

      Date: 2018-12-12 Time zone: Atlantic/Reykjavik
      Date: 2018-12-12 Time zone: America/New_York
      

      格式模式字母v 用于通用时区名称,即无论夏令时(DST)如何,全年都相同的名称,例如东部时间或短东部时间。

      如果您想控制模糊时区缩写(其中有很多)的解释,您可以使用双参数appendGenericZoneText​(TextStyle, Set<ZoneId>),其中第二个参数包含首选时区。如果有办法让您完全避免依赖时区缩写,那就更好了,因为正如我所说,它们通常是模棱两可的。

      不过,我不确定带时区的日期有什么意义。

      另外一点,请始终为您的格式化程序指定区域设置,以便在更改默认区域设置或有一天您的程序在具有不同默认区域设置的 JVM 中运行时它们也可以工作。

      避免使用 SimpleDateFormat 和日期

      我认为SimpleDateFormat 无法解析您的字符串。还是一样,因为那个类已经过时了,而且以麻烦着称,所以无论如何你都不应该使用它。

      【讨论】:

        猜你喜欢
        • 2020-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-28
        • 1970-01-01
        • 1970-01-01
        • 2020-07-15
        相关资源
        最近更新 更多