以ISO 8601格式解析日期时间字符串,而不从UTC返回

时间:2016-06-06 04:51:10

标签: android date

我正在将字符串类型的日期解析为日期格式,但每次都有此异常

java.text.ParseException: Unparseable date: "2016-05-21T00:00:00" (at offset 4)

我的代码是:

   String d = "2016-05-21T00:00:00";
    DateFormat df = new SimpleDateFormat("yyyy MM dd HH:mm:ss", Locale.ENGLISH);
    Date myDate = null;
    try {
        myDate = df.parse(d);
    } catch (ParseException e) {
        e.printStackTrace();
    }

5 个答案:

答案 0 :(得分:6)

您的日期字符串和DateFormat需要匹配。对于您的输入"2016-05-21T00:00:00",正确的DateFormat是:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");

答案 1 :(得分:4)

TL;博士

LocalDateTime.parse( "2016-05-21T00:00:00" )

ISO 8601

输入字符串2016-05-21T00:00:00采用标准ISO 8601格式。

java.time

在解析或生成日期时间值的文本表示时,默认情况下,Java 8及更高版本中内置的java.time类使用ISO 8601格式。

输入字符串缺少任何offset-from-UTCtime zone信息。所以字符串本身是不精确的,没有特定的含义,因为它不是时间轴上的一个时刻。这些值在java.time中由LocalDateTime类表示。

String input = "2016-05-21T00:00:00";
LocalDateTime ldt = LocalDateTime.parse( input );

如果您从较大的上下文知道该字符串旨在对某个偏离UTC的内容有意义,请指定ZoneOffset以获取OffsetDateTime对象。

ZoneOffset zoneOffset = ZoneOffset.of( 5 , 30 );
OffsetDateTime odt = ldt.atOffset( zoneOffet );

更好的是,如果您确定预定的时区,请指定ZoneId以获得ZonedDateTime

ZoneId zoneId = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = ldt.atZone( ZoneId );

关于 java.time

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

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

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:0)

String expectedDateFormat=getDateFromString("2016-05-21 00:00:00","yyyy-MM-dd HH:mm:ss","yyyy MM dd HH:mm:ss");

此方法将执行预期格式的实际格式。

public static String getDateFromString(String dateInString, String actualformat, String exceptedFormat) {
        SimpleDateFormat form = new SimpleDateFormat(actualformat);

        String formatedDate = null;
        Date date;
        try {
            date = form.parse(dateInString);
            SimpleDateFormat postFormater = new SimpleDateFormat(exceptedFormat);
            formatedDate = postFormater.format(date);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return formatedDate;
    }

答案 3 :(得分:-1)

public  class test {

    public static void main(String [] args) {

        // ref http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html
           SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd hh:mm:ss");
          System.out.println("Current Date: " + simpleDateFormat.format(new Date()));
    }

}

了解有关SimpleDateFormat

的更多信息

答案 4 :(得分:-2)

试试这种方式

String d = "2016-05-21 00:00:00";
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
    Date myDate = null;
    try {
        myDate = df.parse(d);
    } catch (ParseException e) {
        e.printStackTrace();
    }

修改

String d = "2016-05-21 00:00:00";
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
    Date myDate = null;
    try {
        myDate = df.parse(d);
    } catch (ParseException e) {
        e.printStackTrace();
    }