[英]Wrong value for hour, minutes and mills when parsing date string to “yyyy-MM-dd'T'HH:mm:ss'-'hh:mm”
我已经尝试了一段时间的不同格式。 但是在将日期字符串解析为日期时遇到了一个问题。
这是我要解析的示例日期字符串。 “ 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”获得值的。 我从Web API获得此值。 有想法吗? 谢谢
我认为您想要的格式是:
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);
根据SimpleDateFormat API文档 ,“ 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
如果您不需要“ -04:00”区域偏移(时区),则只需将字符串“ 2015-04-13T10:17:00-04:00”截断为“ 2015-04-13T10:17:00”
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();
}
结果是:
日期= 2015年4月13日星期一10:17:00
使用Z作为时区。 它应该工作。
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
供参考,这是文档http://developer.android.com/reference/java/text/SimpleDateFormat.html
您正在使用麻烦的旧日期时间类。 避免他们。
使用Java 8和更高版本中内置的java.time框架。 受Joda-Time启发,由JSR 310定义,并由ThreeTen-Extra项目扩展。 寻找Java 6和7以及Android的反向端口。
您的输入字符串恰好是标准ISO 8601格式。 解析/生成日期时间值的文本表示时,java.time类使用ISO 8601作为其默认值。 因此,无需指定格式化模式。
正如其他答案中所述,最后一部分-04:00
确实是自UTC的偏移量 。 这意味着显示的日期时间比UTC晚四个小时。
String input = "2015-04-13T10:17:00-04:00";
OffsetDateTime odt = OffsetDateTime.parse( input );
您可以搜索时区列表,以查看哪些时区使用-04:00
特定偏移量。 我看到了几十个具有该偏移量的区域。
如果您知道预期的时区,请应用它( ZoneId
)。 时区是从UTC偏移的时间, 再加上用于处理异常的规则,例如夏令时(DST) 。 因此,只要您确定正确的时区,使用时区总是比单纯的偏移更好。
ZoneId zoneId = ZoneId.of( "America/Puerto_Rico" );
ZonedDateTime zdt = odt.atZoneSameInstant( zoneId );
上面显示的OffsetDateTime
和ZonedDateTime
对象表示时间轴上的同一时刻。 如果您想在UTC中查看该时刻,例如Instant
。
Instant instant = odt.toInstant(); // …or…
Instant instant = zdt.toInstant(); // Both instants are the same moment on the timeline in UTC.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.