2014-02-07 65 views
1

我有问题格式化日期。解析一些字符串日期到另一种格式

:EEE,d MMM YYYY HH:MM:SS Z(例如:星期一,2014年1月5日15时10分00秒0200)

:DD/MMM/YYYY HH :毫米(例如:2014年5月1日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

一些帮助会很好,谢谢;)

+1

参见[这](http://developer.android.com/reference/java/text/SimpleDateFormat.html),你可以获取所有日期格式的一些想法。 – Yugesh

+0

我已经看到了这个,官方文档很重要,所以..但它没有帮助。我的问题不是文档相关,而是更多关于逻辑。但是,谢谢 –

+0

@ Yume117您正在使用您说的* *输出格式*解析*输入*。您是否在提供示例代码时出错,或者是您的问题的原因? –

回答

4

您需要两次转换。例如:

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) { 
     } 
    } 
+0

我在“formatFrom.parse(date)”得到相同的错误 –

+0

尝试将“d”切换到“dd” –

+0

刚刚尝试一样的。严重的日期是一个痛苦的处理:( –

1

试试这个

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); 
1

试试下面的代码:

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; 
} 
+0

相同的错误在“sqlDateFormat.parse(sqlDate)” –

0

不正确的采样数据

您的示例数据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

至于生成其他格式的字符串,这已经在堆栈溢出中多次覆盖。搜索DateTimeFormatter课程。


关于java.time

java.time框架是建立在Java 8和更高版本。这些类代替了日期时间类legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time项目,现在在maintenance mode,建议迁移到java.time类。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310

随着JDBC driverJDBC 4.2或更高版本相符时,你可以交换java.time直接对象与数据库。无需字符串或java.sql。*类。

从何处获取java.time类?

相关问题