如何从UTC日期时间中获取日期时间?

时间:2020-02-18 08:15:47

标签: android date datetime utc

我正在从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”

4 个答案:

答案 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.time(现代Java日期和时间API,因为旧类(DateCalendar和{{1} })具有lots of problemsdesign issues

SimpleDateFormat

问题:我可以在Android上使用java.time吗?

  • 从Android 8.0( API级别26 )开始,内置了现代API。
  • 对于较旧的android版本,您可以使用ThreeTenABP的Android版本ThreeTen Backport

答案 1 :(得分:2)

  1. SimpleDateFormat无法正确解析您的日期时间字符串。
  2. SimpleDateFormat十分麻烦且已过时。出于此目的或任何其他目的,您都不应使用它。相反,只需使用java.time(现代Java日期和时间API)中的LocalDateTime类即可。它将解析您的字符串,而无需任何显式格式化程序。

您不能使用SimpleDateFormat

您的字符串在分钟的第二秒.04上有两个小数,表示百分之一秒。 SimpleDateFormat仅支持秒中的小数点后三位,而不支持二,四或任何其他数字。因此,它不可能正确解析您的字符串。

java.time

似乎您假设您解析的字符串采用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 API级别26?

java.time在较新和较旧的Android设备上均可正常运行。它只需要至少 Java 6

  • 在Java 8和更高版本以及更新的Android设备(API级别26以上)中,内置了现代API。
  • 在非Android Java 6和7中,获得ThreeTen Backport,这是现代类的backport(JSR 310的ThreeTen;请参见底部的链接)。
  • 在旧版Android上,请使用Android版的ThreeTen Backport。称为ThreeTenABP。并确保使用子包从org.threeten.bp导入日期和时间类。

链接

答案 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);
相关问题