【问题标题】:Parse some string date to another format将一些字符串日期解析为另一种格式
【发布时间】:2014-03-04 15:36:09
【问题描述】:

我有问题格式化日期。

发件人:EEE,d MMM yyyy HH:mm:ss Z(例如:Mon, 05 Jan 2014 15:10:00 +0200)

:dd/MMM/yyyy HH:mm(例如:05/01/2014 15:10)

这是我尝试过的:

private String formatDate(String date) {
    SimpleDateFormat format = new SimpleDateFormat("dd/MMM/yyyy HH:mm");
    Date dateResult = null;
    try {
        dateResult = format.parse(date);
    }
    catch (java.text.ParseException e) {
        Log.e(TAG, "", e);
    }
    return dateResult.toString();
}

我得到异常:偏移量 0 处无法解析的日期

这里有一些帮助会很好,谢谢 ;)

【问题讨论】:

  • 请参阅this,您可以了解所有日期格式。
  • 我已经看到了,官方文档很重要,所以..但它没有帮助。我的问题与文档无关,而与逻辑有关。不过谢谢
  • @Yume117 您正在使用您所说的输出格式解析您的输入。您是否在此处提供示例代码时犯了错误,或者这是您的问题的原因?
  • 是的,我已经明白了,我现在正在尝试下面的帖子,但没有好的结果

标签: java android date simpledateformat android-date


【解决方案1】:

您需要两次转换。例如:

private String formatDate(String date) {
    SimpleDateFormat formatFrom = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z ");

    java.util.Date tmpDate = formatFrom.parse(date);
    SimpleDateFormat formatTo = new SimpleDateFormat("dd/MMM/yyyy HH:mm");
    return formatTo.format(tmpDate);
}

对于我自己的 RSS 解析器,我使用以下代码来解析不同的日期格式:

    if (value.contains("+")) {
        value = value.substring(0, value.lastIndexOf("+") - 1);
    }

    String[] patterns = {//"EEE, dd MMM yyyy hh:mm:ss UTC",
            "yyyy.MM.dd G 'at' HH:mm:ss z",
            "EEE, MMM d, ''yy",
            "yyyyy.MMMMM.dd GGG hh:mm aaa",
            "EEE, d MMM yyyy HH:mm:ss Z",
            "yyMMddHHmmssZ",
            "d MMM yyyy HH:mm:ss z",
            "yyyy-MM-dd'T'HH:mm:ss",
            "yyyy-MM-dd'T'HH:mm:ss'Z'",
            "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
            "yyyy-MM-dd'T'HH:mm:ssZ",
            "yyyy-MM-dd'T'HH:mm:ss.SSSZ",
            "yyyy-MM-dd'T'HH:mm:ssz",
            "yyyy-MM-dd'T'HH:mm:ss.SSSz",
            "EEE, d MMM yy HH:mm:ssz",
            "EEE, d MMM yy HH:mm:ss",
            "EEE, d MMM yy HH:mm z",
            "EEE, d MMM yy HH:mm Z",
            "EEE, d MMM yyyy HH:mm:ss z",
            "EEE, d MMM yyyy HH:mm:ss Z",
            "EEE, d MMM yyyy HH:mm:ss ZZZZ",
            "EEE, d MMM yyyy HH:mm z",
            "EEE, d MMM yyyy HH:mm Z",
            "d MMM yy HH:mm z",
            "d MMM yy HH:mm:ss z",
            "d MMM yyyy HH:mm z",
            "d MMM yyyy HH:mm:ss z"};

    for (int i = 0; i < patterns.length; i++) {
        SimpleDateFormat sdf = new SimpleDateFormat(patterns[i], Locale.ENGLISH);
        try {
            pubdate = sdf.parse(value);

            break;
        } catch (Exception e) {
        }
    }

【讨论】:

  • 尝试将“d”切换为“dd”
  • 刚刚试了还是一样。认真地约会是一件很痛苦的事情:(
  • 刚刚试了还是一样。也许日期格式是错误的,但我无法弄清楚
  • 你在哪里得到你的约会?你知道你收到什么格式的日期吗?我会更新我的帖子,也许它会对你有所帮助。
  • 我从 xml 流中得到它。是的,我记录的格式始终相同。例如:“2012 年 10 月 12 日星期五 06:57:39 +0200”
【解决方案2】:

试试这个

SimpleDateFormat form = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");
SimpleDateFormat postFormater = new SimpleDateFormat("dd/MMM/yyyy HH:mm");

String inputdate = "Mon, 05 Jan 2014 15:10:00 +0200";

Date date = null;

    try {
        date = form.parse(inputdate);

    } catch (ParseException e) {
        e.printStackTrace();

    }

String resultdate = postFormater.format(date);

【讨论】:

    【解决方案3】:

    试试下面的代码:

    String parseStringDate(String sqlDate) {
        String strDate = "";
        java.util.Date utilDate;
    
        SimpleDateFormat sqlDateFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");
        try {
            Calendar calTempDate = Calendar.getInstance();
            utilDate = sqlDateFormat.parse(sqlDate);
    
            calTempDate.setTime(utilDate);
            strDate = new SimpleDateFormat("dd/MMM/yyyy HH:mm").format(calTempDate.getTime());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return strDate;
    }
    

    【讨论】:

      【解决方案4】:

      样本数据不正确

      Mon, 05 Jan 2014 15:10:00 +0200 的示例数据不正确。那个日期是星期日,而不是星期一。

      java.time

      现代方法是使用 java.time 类。

      您的输入格式符合RFC 1123。 java.time 类包括formatter for that specific format

      String input = "Sun, 05 Jan 2014 15:10:00 +0200";
      DateTimeFormatter f = DateTimeFormatter.RFC_1123_DATE_TIME ;
      OffsetDateTime odt = OffsetDateTime.parse( input , f );
      

      odt.toString(): 2014-01-05T15:10+02:00

      live code in IdeOne.com

      至于生成其他格式的字符串,这在 Stack Overflow 中已经讲过很多次了。搜索DateTimeFormatter class。


      关于java.time

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

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

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

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

      从哪里获取 java.time 类?

      【讨论】:

      • 无法使用 EEEE 解析 2 月 18 日星期日,dd'th' MMMM 不工作?
      • @SagarHudge 发布您自己的问题,并附上详细信息和MCVE
      • @SagarHudge (a) 指定Locale。 (b) 你需要一年来输入。没有年份就无法确定星期几。否则,对于没有任何年份、没有任何时间或时区的月份和日期,请使用 YearMonth 类。 LocalDate.parse( "Sunday, 18th February 2018" , DateTimeFormatter.ofPattern( "EEEE, dd'th' MMMM uuuu" , Locale.US ) )
      猜你喜欢
      • 2019-11-10
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多