将日期字符串解析为" yyyy-MM-dd' HH:mm:ss' - ' hh:mm"以及小时,分钟和工厂的错误值

时间:2015-04-13 14:40:19

标签: java android date datetime

我现在已经尝试了不同的格式了一段时间。但是在将日期字符串解析为日期时遇到了问题。

这是我尝试解析的示例日期字符串。 " 2015-04-13T10:17:00-04:00"

这是我的代码:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'-'hh:mm", Locale.ENGLISH);
            try {
                startCal.setTime(format.parse(data.StartTime));
                endCal.setTime(format.parse(data.EndTime));
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

我在日志上打印时获得的值是

Log.i("Event exact date", String.valueOf(startCal.getTime().toString()));

04-13 22:38:11.526: I/Event exact date(1665): Mon Apr 13 04:00:00 GMT+08:00 2015

我希望小时值为10,分钟为17.我认为它是从" -hh:mm"获得的值。我从网络API获取此值。有什么想法吗?感谢

4 个答案:

答案 0 :(得分:2)

我认为你想要的格式是:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);

根据SimpleDateFormat API docs,' XXX'表示ISO 8601时区。

完整示例:

public class TestDateParse {
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);

        Date date = format.parse("2015-04-13T10:17:00-04:00");
        System.out.println("date: " + date);
    }
}

测试输出:

date: Mon Apr 13 16:17:00 CEST 2015

答案 1 :(得分:0)

如果您不需要“-04:00”区域偏移(时区),则只需将字符串“2015-04-13T10:17:00-04:00”截断为“2015-04-13T10:17:00”< / p>

        String fullDate = "2015-04-13T10:17:00-04:00";
        String truncatedDate = fullDate.substring(0, fullDate.lastIndexOf('-'));

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss",
                Locale.ENGLISH);
        try {

            Date dte = format.parse(truncatedDate);
            System.out.println("date=" + dte);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

结果是:

  

date = Mon Apr 13 10:17:00 CEST 2015

答案 2 :(得分:0)

将Z用于时区。它应该工作。

 new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

供参考,这是文档http://developer.android.com/reference/java/text/SimpleDateFormat.html

答案 3 :(得分:0)

java.time

您正在使用麻烦的旧日期时间类。避免它们。

使用Java 8及更高版本中内置的java.time框架。灵感来自Joda-Time,由JSR 310定义,并由ThreeTen-Extra项目进行扩展。寻找后端for Java 6 & 7for Android

您的输入字符串恰好采用标准ISO 8601格式。在解析/生成日期时间值的文本表示时,java.time类使用ISO 8601作为其默认值。因此无需指定格式化模式。

偏移

最后一部分-04:00确实是其他答案中提到的offset-from-UTC。这意味着显示的日期时间比UTC落后四个小时。

String input = "2015-04-13T10:17:00-04:00";
OffsetDateTime odt = OffsetDateTime.parse( input );

时区

您可以搜索the list of time zones以查看哪些区域使用-04:00的特定偏移量。我看到几十个带有偏移的区域。

如果您知道预期的时区,请应用它(ZoneId)。 time zoneoffset-from-UTC 加上处理Daylight Saving Time (DST)等异常的规则。因此,只要您确定正确的区域,使用时区总是优于仅仅偏移。

ZoneId zoneId = ZoneId.of( "America/Puerto_Rico" );
ZonedDateTime zdt = odt.atZoneSameInstant( zoneId );

UTC

上面看到的OffsetDateTimeZonedDateTime对象代表了时间轴上的相同时刻。如果您希望以UTC显示该时刻,那么Instant

Instant instant = odt.toInstant();  // …or…
Instant instant = zdt.toInstant();  // Both instants are the same moment on the timeline in UTC.