我使用这个库在我的应用程序中存储与日期和时间相关的数据。当应用程序启动时,AndroidThreeTen首先被初始化以正常运行。所以想问一下单元测试的时候怎么初始化呢?比如我想测试使用LocalDate,LocalDateTime等等。
我现在的方式是这样的:
class OverviewViewModelTest {
@Rule
@JvmField
val rule = InstantTaskExecutorRule()
@Before
fun setup() {
AndroidThreeTen.init(Application())
}
//...
}
Run Code Online (Sandbox Code Playgroud)
但它抛出这个错误:
java.lang.ExceptionInInitializerError
at org.threeten.bp.ZoneRegion.ofId(ZoneRegion.java:143)
at org.threeten.bp.ZoneId.of(ZoneId.java:358)
at org.threeten.bp.ZoneId.of(ZoneId.java:286)
at org.threeten.bp.ZoneId.systemDefault(ZoneId.java:245)
at org.threeten.bp.Clock.systemDefaultZone(Clock.java:137)
at org.threeten.bp.LocalDate.now(LocalDate.java:165)
Caused by: java.lang.RuntimeException: Method getAssets in android.content.ContextWrapper not mocked. See http://g.co/androidstudio/not-mocked for details.
at android.content.ContextWrapper.getAssets(ContextWrapper.java)
at com.jakewharton.threetenabp.AssetsZoneRulesInitializer.initializeProviders(AssetsZoneRulesInitializer.java:22)
at org.threeten.bp.zone.ZoneRulesInitializer.initialize(ZoneRulesInitializer.java:89)
at org.threeten.bp.zone.ZoneRulesProvider.<clinit>(ZoneRulesProvider.java:82)
... 32 more
Run Code Online (Sandbox Code Playgroud)
那么我怎样才能让这个库在单元测试中工作呢?
我目前正在开发一个最低API版本为17(JellyBean)的Android Studio项目,因此我无法使用该java.time软件包.相反,我正在使用Android(com.jakewharton.threetenabp:threetenabp:1.1.0)的ThreeTen backport .
我的问题是每个类com.threeten.bp匹配一个java.time,我发现很容易意外导入错误的类,因为自动完成弹出窗口java.time首先显示该选项.我需要一种方法来java.time从我的项目中删除该包,或者至少告诉Android Studio忽略它.有可能吗?
我收到的日期格式如下:
“最后期限”:“ 2019-07-05T16:30:00”
我正在尝试使用以下格式化程序解析它:
private val formatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss", Locale.ENGLISH)
Run Code Online (Sandbox Code Playgroud)
但是我收到以下异常:
org.threeten.bp.format.DateTimeParseException: Text '2019-05-21T12:30:00' could not be parsed at index 19
Run Code Online (Sandbox Code Playgroud)
注意:我正在使用ThreeTenABP库
我正在使用 ThreeTen-Backport (特别是ThreeTenABP)来显示项目中的时间戳。我希望显示的时间戳以本地化格式显示(基于Locale系统的);使用以下任一方法都很容易DateTimeFormatter.ofLocalizedDateTime():
DateTimeFormatter formatter = DateTimeFormatter\n .ofLocalizedDateTime(FormatStyle.LONG)\n .withLocale(Locale.getDefault())\n .withZone(ZoneId.systemDefault());\n\nString timestamp = formatter.format(Instant.now());\nRun Code Online (Sandbox Code Playgroud)\n\nFormatStyle问题是我对只有四种类型(SHORT、MEDIUM、LONG、 )的格式化程序的输出没有太多控制FULL。我很好奇是否有一种方法可以对输出进行更精细的控制,而不丢失本地化格式。
timestamp使用前面的代码,区域设置的结果"en_US"将是:
"January 23, 2017 1:28:37 PM EST"\nRun Code Online (Sandbox Code Playgroud)\n\n虽然区域设置的结果"ja_JP"是:
"2017\xe5\xb9\xb41\xe6\x9c\x8823\xe6\x97\xa5 13:28:37 GMT-5:00"\nRun Code Online (Sandbox Code Playgroud)\n\n正如您所看到的,每个区域设置都使用特定的模式,并使用默认的 12 或 24 小时格式。我想保留本地化模式,但更改一些内容,例如是否显示时区,或者是否使用 12 小时或 24 小时格式。
\n\n例如; 如果我可以将两个区域设置设置为使用 12 小时格式,并删除时区;结果如下所示:
\n\n"January 23, 2017 1:28:37 PM"\n\n"2017\xe5\xb9\xb41\xe6\x9c\x8823\xe6\x97\xa5 1:28:37\xe5\x8d\x88\xe5\xbe\x8c"\nRun Code Online (Sandbox Code Playgroud)\n 我正在使用使用 ThreeTen 日期类型的客户端库(第三方,不是我的,无法更改)。我的项目是 Java 11 并使用 Java 8 日期类型。将 ThreeTeen 对象转换为 Java 8 对象的推荐方法是什么?
我有一个 org. Threeten.bp.LocalDate 和一个 org. Threeten.bp.LocalTime 并且我确实需要一个 java.util.date 实例。实现这一目标的最佳方法是什么?我查看了DateTimeUtils但没有找到合适的解决方案。
我试图将日期/时间字符串来回转换为LocalDateTime对象。我正在使用ThreeTenBp作为日期/时间库。
val actual = LocalDateTime.parse("2016-12-27T08:15:05.674+01:00",
DateTimeFormatter.ISO_DATE_TIME)
val expected = LocalDateTime.of(2016, 12, 27, 8, 15, 5, 674000000)
assertThat(actual).isEqualTo(expected) // Successful
Run Code Online (Sandbox Code Playgroud)
val dateTime = LocalDateTime.of(2016, 12, 27, 8, 15, 5, 674000000)
val actual = dateTime.format(DateTimeFormatter.ISO_DATE_TIME)
assertThat(actual).isEqualTo("2016-12-27T08:15:05.674+01:00") // Fails
Run Code Online (Sandbox Code Playgroud)
由于某些原因,缺少时区:
预期:<... 6-12-27T08:15:05.674 [+01:00]“>但是是:<... 6-12-27T08:15:05.674 []”>
预期:“ 2016-12- 27T08:15:05.674 + 01:00“
实际的:” 2016-12-27T08:15:05.674“
当我们有一些代码从中调用 LocalDate.now() 时,渲染 Jetpack Compose 预览会失败。我们尝试在预览中设置区域设置,但这没有帮助,并且我们还没有找到任何其他方法来设置预览中的上下文信息。
我们怎样才能做到这一点?
预览渲染问题堆栈跟踪:
org. Threeten.bp.zone.ZoneRulesException:没有在 org. Threeten.bp.zone.ZoneRulesProvider.getProvider(ZoneRulesProvider.java:165) 处注册的时区数据文件 org. Threeten.bp.zone.ZoneRulesProvider.getRules(ZoneRulesProvider) .java:122) 在 org. Threeten.bp.ZoneRegion.ofId(ZoneRegion.java:143) 在 org. Threeten.bp.ZoneId.of(ZoneId.java:358) 在 org. Threeten.bp.ZoneId.of( ZoneId.java:286) 位于 org. Threeten.bp.ZoneId.systemDefault(ZoneId.java:245) 位于 org. Threeten.bp.Clock.systemDefaultZone(Clock.java:137) 位于 org. Threeten.bp.LocalDate.now (LocalDate.java:165) 在 xxx.ui.shared.formatter.OrderDateFormatter.getFormattedTimes(OrderDateFormatter.kt:12) 在 xxx.model.Pickup.displayCreatedTime(Pickup.kt:55) 在 xxx.ui.orderStatus.pickups。 PickupsListKt.DateRows(PickupsList.kt:268) 在 xxx.ui.orderStatus.pickups.PickupsListKt.PickupPanelDetails(PickupsList.kt:129) 在 xxx.ui.orderStatus.pickups.PickupsListKt.PickupPanel(PickupsList.kt:78) 在 xxx .ui.orderStatus.pickups.PickupsListKt$PickupsList$1$1.invoke(PickupsList.kt:51) 在 xxx.ui.orderStatus.pickups.PickupsListKt$PickupsList$1$1.invoke(PickupsList.kt:49) 在 androidx.compose.runtime .internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) 在 androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) 在 xxx.ui.shared.composables.LoadingComposableKt.LoadingComposable(LoadingComposable) .kt:39) 在 xxx.ui.orderStatus.pickups.PickupsListKt.PickupsList(PickupsList.kt:49) 在 xxx.ui.orderStatus.pickups.ComposableSingletons$PickupsListKt$lambda-1$1.invoke(PickupsList.kt:337)在 xxx.ui.orderStatus.pickups.ComposableSingletons$PickupsListKt$lambda-1$1.invoke(PickupsList.kt:336) 在 androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) 在 androidx。 compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) 在 xxx.ui.shared.appTheme.AppThemeKt$AppTheme$1.invoke(AppTheme.kt:56) 在 xxx.ui.shared.appTheme.AppThemeKt $AppTheme$1.invoke(AppTheme.kt:55) 在 androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107) 在 androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm. kt:34) …
android threetenbp android-jetpack-compose android-jetpack-compose-preview
我有以下从 API 获得的日期2022-11-23 06:12:31
我想知道我的方法是否是最好的。
我需要以这种格式显示23 November 2022
我用来substringbefore删除时间部分,所以剩下以下内容:"2022-11-23"
我在用org.threeten.bp
val DAY_MONTH_YEAR_DISPLAY_FORMATTER =
DateTimeFormatter.ofPattern("dd MMMM yyyy").withZone(ZoneOffset.systemDefault())
fun formatAsFullMonthDisplayDate(localDateTime: String): String {
return try {
LocalDate.parse(localDateTime.substringBefore(" "), DAY_MONTH_YEAR_DISPLAY_FORMATTER).buildDate()
} catch (ignored: Exception) {
""
}
}
private fun LocalDate.buildDate(): String {
return buildString {
append(this@buildDate.dayOfMonth)
append(" ")
append(this@buildDate.month)
append(" ")
append(this@buildDate.year)
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Android 的Threetenbp backport (此处)来处理各种与时间相关的数据操作。
其中之一是将时间转换为不同的时区(当前为 UTC 并返回)。
我知道如果你使用类似的东西这是可能的:
LocalDateTime now = LocalDateTime.now();
LocalDateTime nowInUtc = now.atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneId.of("UTC")).toLocalDateTime();
Run Code Online (Sandbox Code Playgroud)
这工作得很好,而且也很容易做相反的事情。
我试图避免库的初始化,它会向其中加载相当大的区域文件。我已经弄清楚如何在没有这个的情况下处理各种日期/时间相关的操作,除了转换为 UTC 并返回的情况。
我得到的结果与正确的转换相差整整 1 小时。
这是我发现并尝试过的:
// getting the current time, using current time zone:
Calendar cal = Calendar.getInstance();
LocalDateTime now = LocalDateTime.of(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH), cal.get(Calendar.HOUR_OF_DAY),
cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND), cal.get(Calendar.MILLISECOND) * 1000000);
//the conversion itself, which is wrong by 1 hour in my tests:
LocalDateTime alternativeNowInUtc = now.atZone(ZoneOffset.ofTotalSeconds(TimeZone.getDefault().getRawOffset() / 1000)).withZoneSameInstant(ZoneId.ofOffset("UTC", ZoneOffset.ofHours(0))).toLocalDateTime();
Run Code Online (Sandbox Code Playgroud)
我写的到底有什么问题?如何在不初始化库的情况下获得转换时间的替代代码?
给定 LocalDateTime …
我们在项目中使用Three Ten Backport,因为我们的一个客户正在使用Java 7. Three Ten Backport为我们提供了Java 8中引入的新日期时间功能(java.time.*).
我想知道以下是否是一个好习惯.由于我们的大多数客户都使用Java 8,有一天我们可能会将所有客户升级到Java 8,使用org.threeten.bp完全限定类名是否真的有意义?最终,我们可能会将所有客户升级到Java 8并删除此依赖关系,如果我们最终执行此操作,那么如果我们只使用没有包前缀的类名,则代码更改将会更少.举一个代码示例,我的意思是这个.
import org.threeten.bp.LocalDate Time;
public class Example {
public void example() {
LocalDateTime datetime = // ....
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在示例中看到我引用了没有包前缀的LocalDateTime.在Java 8中,是否会加载java.time.LocalDateTime类,或者org.threeten.bp.LocalDateTime?这有点不清楚,因为在这个代码中,在Java 8中,有两个LocalDateTime浮动,一个来自java.time,另一个来自org.threeten.bp.我假设本机Java库将被赋予优先权并加载,但我可能是错的.
这样做是好事吗?或者它可以生成编译器警告/错误?即使它没有产生任何警告或错误,它仍然是一个不好的做法?我很想这样做,因为通过包完全限定类只是简单的丑陋,如果我们最终删除了Three Ten依赖项,那么我们将不得不更改该代码的每个实例,而不是仅仅删除import语句.很高兴听到你的想法.
我有以下代码:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.UK);
Instant inst = DateTimeUtils.toInstant(sdf.parse("2019-08-13T18:00:00Z"));
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm").withLocale(Locale.UK).withZone(ZoneId.of("Europe/London"));
System.out.println(formatter.format(inst));
//prints 18:00
Run Code Online (Sandbox Code Playgroud)
这让我感到惊讶,因为我认为inst这将是 GMT/UTC 时间,并且formatter会将其格式化为伦敦时间(该日期为 BST(UTC+1:00)),生成19:00.
我在这里缺少什么?
我猜这是我的代码一个通用的问题,但如果它的确与众不同,这是利用org.threeten.bp.*从类ThreeTen-反向移植项目,在另外的适应Android的早期ThreeTenABP项目。
我使用ThreeTen模块,当我打印时ZonedDateTime.now(),我得到了。
2019-07-11T22:43:36.564-07:00[America/Los_Angeles]
Run Code Online (Sandbox Code Playgroud)
这个的格式是什么?我试过了uuuu-MM-dd'T'HH:mm:ss.SSS'Z',它说,
org.threeten.bp.format.DateTimeParseException: Text '2019-07-11T22:43:36.564-07:00[America/Los_Angeles]' could not be parsed at index 23
Run Code Online (Sandbox Code Playgroud)
所以,之后的SSS部分'Z'是不正确的。
实施它的正确方法是什么?
这是我的代码:
val pstTime = ZonedDateTime.now(ZoneId.of("America/Los_Angeles")).toString()
val timeFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSS'Z'")
val mTime = LocalDateTime.parse(pstTime, timeFormatter).toString()
tv_pstTime.text = mTime
Run Code Online (Sandbox Code Playgroud)
我想将其解析为类似Tuesday, July 2 5:15:01 P.M.
我该怎么做?
threetenbp ×13
android ×7
java ×5
datetime ×2
java-time ×2
kotlin ×2
android-jetpack-compose-preview ×1
java-8 ×1
jsr310 ×1
localization ×1
threetenabp ×1
timezone ×1
unit-testing ×1
utc ×1