【问题标题】:I am trying to parse date but I got timezone exception我正在尝试解析日期,但出现时区异常
【发布时间】:2016-06-23 23:08:33
【问题描述】:

这是我的日期字符串“Thu Feb 25 12:58:28 MST 2016”,我使用这个格式“E MMM dd HH:mm:ss Z yyyy”进行解析。

但我收到日期解析错误。

我该怎么办?

我正在使用以下函数解析日期字符串

public static String getDate(String targrtDate) {
    String dateStr = targrtDate;
    DateFormat formatter = new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy");
    Date date = null;
    try {
        date = (Date) formatter.parse(dateStr);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    System.out.println(date);

    if (date == null) {
        return "";
    }

    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    String formatedDate = cal.get(Calendar.DATE) + "/" + (cal.get(Calendar.MONTH) + 1) + "/" + cal.get(Calendar.YEAR);
    String formatedTime = cal.get(Calendar.HOUR) + "/" + cal.get(Calendar.MINUTE);

    Log.i("formatedDate", "" + formatedDate + " " + formatedTime);

    return formatedDate;
}

【问题讨论】:

  • 您使用的代码运行良好。只需从 java.util.Date 导入 Date 类。如果你从 import java.sql.Date 导入日期类,那么你会得到异常。只需从 java.sql.Date 导入 Date 类。
  • 是的,我导入了你告诉我的同一个类,但是如果我使用 Thu Feb 25 12:58:28 GMT 2016,那么工作正常,但是当我使用 MST 作为时区时,它会给出解析错误。跨度>
  • MST时区的解决方法是什么?
  • 我刚刚更改了您的代码 SimpleDateFormat formatter = new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy");它工作正常我已经测试了日期“Thu Feb 25 12:58:28 MST 2016”一旦检查这个
  • 为了安全起见,您应该使用new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy", Locale.US);,因为您的模式对区域设置敏感,并且您的默认区域设置可能不是英语。

标签: android datetime calendar simpledateformat


【解决方案1】:

我已经解决了我的日期解析问题。

如果有人使用 MST 时区,如果它给出了解析错误,那么请添加 SimpleDateFormat() 的第二个参数为

new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy", Locale.US);

所以我的最终代码是

public static String getDate(String targrtDate) {
    String dateStr = targrtDate;
    SimpleDateFormat formatter = new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy", Locale.US);
    Date date = null;
    try {
        date = (Date) formatter.parse(dateStr);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    System.out.println(date);

    if (date == null) {
        return "";
    }

    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    String formatedDate = cal.get(Calendar.DATE) + "/" + (cal.get(Calendar.MONTH) + 1) + "/" + cal.get(Calendar.YEAR);
    String formatedTime = cal.get(Calendar.HOUR) + ":" + cal.get(Calendar.MINUTE);

    Log.i("formatedDate", "" + formatedDate + " " + formatedTime);

    return formatedDate;
}

特别感谢@MenoHochschild

【讨论】:

    【解决方案2】:

    tl;博士

    ZonedDateTime.parse( 
        "Thu Feb 25 12:58:28 MST 2016" , 
        DateTimeFormatter.ofPattern( "E MMM dd HH:mm:ss z uuuu" , Locale.US ) 
    )
    

    2016-02-25T12:58:28-07:00[美国/丹佛]

    java.time

    现代方法使用 java.time 类。对于 Android,请参阅下面的最后一个项目符号。

    String input =  "Thu Feb 25 12:58:28 MST 2016" ;
    DateTimeFormatter f = DateTimeFormatter.ofPattern( "E MMM dd HH:mm:ss z uuuu" , Locale.US ) ;
    ZonedDateTime zdt = ZonedDateTime.parse( input , f ) ;
    

    查看此代码在 IdeOne.com 上实时运行。 (但请注意,该站点上的 JVM 已硬连接到 Locale.US,其他任何内容都将被忽略。)

    zdt.toString(): 2016-02-25T12:58:28-07:00[美国/丹佛]

    您的输入字符串格式很糟糕。如果可能,更改为使用标准的ISO 8601 格式。标准格式实用,易于机器解析,并且易于跨文化的人类阅读。方便的是,这些格式在解析/生成字符串时默认在 java.time 类中使用。

    continent/region 的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用 3-4 个字母的缩写,例如 MSTESTIST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。

    ZoneId zEdmonton = ZoneId.of( "America/Edmonton" ) ;
    ZoneId zDenver = ZoneId.of( "America/Denver" ) ;
    ZoneId zMazatlan = ZoneId.of( "America/Mazatlan" ) ;
    

    关于java.time

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

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

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

    从哪里获得 java.time 类?

    【讨论】:

      猜你喜欢
      • 2018-03-06
      • 2020-09-08
      • 2018-04-18
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多