我正在从rest api获取日期时间,例如“ 2020-02-13T16:57:13.04。如何在Java for Android中进行转换?这样我只能单独使用日期或时间?
我已经尝试过
String dateStr = rowsArrayList.get(position).getDisplayDate();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ENGLISH);
df.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = null;
try {
date = df.parse(dateStr);
df.setTimeZone(TimeZone.getDefault());
String formattedDate = df.format(date);
Log.d("testDate",formattedDate);
} catch (ParseException e) {
e.printStackTrace();
Log.d("testDate",e.toString());
}
但是出现错误
java.text.ParseException:无法解析的日期:“ 2020-02-13T16:57:13.04”
答案 0 :(得分:2)
使用yyyy-MM-dd'T'HH:mm:ss.SS
作为格式,而不是yyyy-MM-dd'T'HH:mm:ss'Z'
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SS", Locale.ENGLISH);
您还可以使用java.time
(现代Java日期和时间API,因为旧类(Date
,Calendar
和{{1} })具有lots of problems和design issues:
SimpleDateFormat
答案 1 :(得分:2)
SimpleDateFormat
无法正确解析您的日期时间字符串。SimpleDateFormat
十分麻烦且已过时。出于此目的或任何其他目的,您都不应使用它。相反,只需使用java.time(现代Java日期和时间API)中的LocalDateTime
类即可。它将解析您的字符串,而无需任何显式格式化程序。您的字符串在分钟的第二秒.04
上有两个小数,表示百分之一秒。 SimpleDateFormat
仅支持秒中的小数点后三位,而不支持二,四或任何其他数字。因此,它不可能正确解析您的字符串。
似乎您假设您解析的字符串采用UTC,并且希望将其转换为设备的默认时区。您的字符串采用ISO 8601格式,这是java.time类解析为默认格式的格式,因此我们无需指定任何格式化程序。
String dateStr = "2020-02-13T16:57:13.04";
LocalDateTime dateTime = LocalDateTime.parse(dateStr);
ZonedDateTime inDefaultTimeZone = dateTime.atOffset(ZoneOffset.UTC)
.atZoneSameInstant(ZoneId.systemDefault());
System.out.println(inDefaultTimeZone);
在欧洲/哥本哈根时区的计算机上,此代码段的输出为:
2020-02-13T17:57:13.040 + 01:00 [欧洲/哥本哈根]
java.time在较新和较旧的Android设备上均可正常运行。它只需要至少 Java 6 。
org.threeten.bp
导入日期和时间类。java.time
。java.time
向Java 6和7(JSR-310的ThreeTen)的反向端口。答案 2 :(得分:1)
在格式字符串中取出'Z'
这应该有效:
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ENGLISH);
或者,如果您想保留毫秒,请使用SS
:
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SS", Locale.ENGLISH);
答案 3 :(得分:0)
String dateStr = "Jul 16, 2013 12:08:59 AM";
SimpleDateFormat df = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss a", Locale.ENGLISH);
df.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = df.parse(dateStr);
df.setTimeZone(TimeZone.getDefault());
String formattedDate = df.format(date);