繁体   English   中英

Android-junit-单元测试-带有时区的SimpleDateFormat

[英]Android - junit - unit test - SimpleDateFormat with Timezone

我正在使用Android,JUnit和SimpleDateFormat

我想在带有时区的rfc3339格式的StringDate之间进行一些转换。

例如: 2017-12-31T23:59:59+02:00但不是2017-12-31T23:59:59+0200

Android SimpleDateFormat使用Z模式而不是X模式(请参阅下面的RFC3339_REGEX_1 )。

但是在我的JUnit测试(jdk1.8)中, RFC3339_REGEX_1不能为我提供正确的格式( +02:00 ),而是给我+0200 JUnit测试在RFC3339_REGEX_2运行良好。

那么,我该如何做一些在Android设备和JUnit测试上都能很好运行的干净操作呢?

public static final String RFC3339_REGEX_1 = "yyyy-MM-dd'T'HH:mm:ssZ"; //android
public static final String RFC3339_REGEX_2 = "yyyy-MM-dd'T'HH:mm:ssXXX"; //java

旧的类( DateCalendarSimpleDateFormat )存在很多问题设计问题 ,并且已被新的API取代。 而且,如果我没记错,那么X模式并非在所有版本中都适用 (我知道在JDK 6中不支持 X模式,仅在JDK 7中引入了X模式;不知道这会如何影响不同的Android版本)。

或者,在Android中,您可以使用ThreeTen Backport 要使其工作,您还需要ThreeTenABP在此处查看如何使用它)。

但是,如果仍然需要使用java.util.Date ,则此API可以使您更轻松。 如果您想要类似2017-12-31T23:59:59+02:00的格式,则可以将java.util.Date转换为org.threeten.bp.OffsetDateTime (使用org.threeten.bp.DateTimeUtils类进行转换值,以及将org.threeten.bp.ZoneOffset设置为+02:00org.threeten.bp.ZoneOffset

// assuming that java.util.Date has value equivalent to 2017-12-31T23:59:59+02:00
Date date = ...
// convert to OffsetDateTime (use +02:00 offset)
OffsetDateTime odt = DateTimeUtils.toInstant(date).atOffset(ZoneOffset.of("+02:00"));
System.out.println(odt); // 2017-12-31T23:59:59+02:00

输出将是:

2017-12-31T23:59:59 + 02:00

请注意,这是odt.toString() (由System.out.println称为隐式)的结果,默认情况下,它与所需的格式匹配。 但是您也可以通过使用org.threeten.bp.format.DateTimeFormatter强制执行特定格式:

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX");
System.out.println(fmt.format(odt));

输出是相同的。 唯一的区别是,第一个版本(使用toString() )将在不为零的情况下打印秒的分数,如果它们为零则将省略秒,而第二个版本(使用格式化程序)将始终在所需的格式(在这种情况下,显示秒,但不打印秒的分数),无论值是否为零。

我认为,就您而言,您将需要一个格式化程序,因为您似乎总是需要一种具有秒且没有几分之一秒的格式。


要将OffsetDateTime转换回Date ,还可以使用DateTimeUtils

// convert back to java.util.Date
date = DateTimeUtils.toDate(odt.toInstant());

如果您不需要使用java.util.Date ,则可以直接使用OffsetDateTime

// create OffsetDateTime with value = 2017-12-31T23:59:59+02:00
OffsetDateTime odt = OffsetDateTime.of(2017, 12, 31, 23, 59, 59, 0, ZoneOffset.ofHours(2));

还要注意,我使用了ZoneOffset.ofHours(2) ,它等效于ZoneOffset.of("+02:00")

您还可以使用OffsetDateTime.now(ZoneOffset.ofHours(2))获得当前日期。


ThreeTen Backport是新Java 8日期/时间类的OffsetDateTime ,它具有许多不同的日期和时间类型(例如上面的OffsetDateTime ),可以在不同情况下使用。 查看本教程,以获得有关哪种类型最适合您的情况的更多信息-本教程涵盖Java 8,但是ThreeTen Backport具有相同的类和方法名称,只是包不同: org.threeten.bp而不是java.time

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM