- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
java.time
库是否提供了一种统一的方式来解析整个 ISO-8601 Duration Specification ?
Alexa Slot Type reference for duration列出了使用 AMAZON.DURATION 插槽类型时预期的一些示例字符串。所有字符串都在 ISO-8601 Duration 中,但是 P2YT3H10
不能被 java.time.Period
或 java.time.Duration
解析。
Seq(
"PT10M",
"PT5H",
"P3D",
"PT45S",
"P8W",
"P7Y",
"PT5H10M",
"P2YT3H10"
).map { s =>
s -> Try {
try {
Period.parse(s)
} catch {
case ex: Throwable => Duration.parse(s)
}
}.map(x => x.toString -> x.getClass.getSimpleName)
}
.foreach(println)
结果:
(PT10M,Success((PT10M,Duration)))
(PT5H,Success((PT5H,Duration)))
(P3D,Success((P3D,Period)))
(PT45S,Success((PT45S,Duration)))
(P8W,Success((P56D,Period)))
(P7Y,Success((P7Y,Period)))
(PT5H10M,Success((PT5H10M,Duration)))
(P2YT3H10,Failure(java.time.format.DateTimeParseException: Text cannot be parsed to a Duration))
最佳答案
Hugos 的回答只涉及 ISO-8601 标准的一个细节方面,即日期和时间部分与“T”分隔符的组合。 java.time
确实不支持此细节,但外部库 Threeten-Extra 支持(使用版本 v1.2 中的类 PeriodDuration
)。然而:
一种变体是以“P8W”形式使用周。 java.time
和 Threeten-Extra 都会自动将其更改为“P56D”,但在解析和格式化时不要将其保留为与星期相关的形式。查看时间分量时可以获得类似的 View 。 java.time.Duration
不能直接存储小时或分钟,而是自动将其转换为秒。格式化时也会执行自动规范化。示例:
System.out.println(Duration.parse("PT4200S")); // PT1H10M
所以在这两种情况下:在构建过程中放入的内容并不总是在格式化时得到的内容。
其他要点:
java.time
使用两个不同的术语,即 Period
和 Duration
(与日期相关或与时间相关)。java.time
甚至在表示内部也允许符号并将符号解释为与组件相关。请注意,XML-Schema 仅处理整个持续时间表达式之前的符号(“P”之前),这与组件无关但与持续时间相关。java.time.Duration
只支持点.最后我们可以声明:
java.time
仅部分支持 ISO-8601 标准(而 Threeten-Extra 仅支持类 Period
和 java 的组合.time.Duration
作为附加细节)。
真正支持 ISO-8601 的替代解决方案:
如果您想甚至需要克服 java.time
中的限制,那么您可以使用我的库 Time4J它支持 ISO-8601 的所有附加细节。参见类的 API net.time4j.Duration .以下示例还显示了与 java.time
的兼容性:
Duration<CalendarUnit> d1 = Duration.parseCalendarPeriod("P8W");
System.out.println(d1); // P8W
System.out.println(d1.getPartialAmount(CalendarUnit.WEEKS)); // 8
System.out.println(Duration.Formatter.ofPattern(CalendarUnit.class, "W' weeks'").format(d1)); // 8 weeks
System.out.println(PrettyTime.of(Locale.GERMAN).print(d1)); // 8 Wochen
LocalDate ld = LocalDate.of(2017, 9, 17);
System.out.println(PlainDate.from(ld).plus(d1)); // 2017-11-12
System.out.println(PlainDate.of(2017, 9, 17).plus(d1)); // 2017-11-12
Duration<IsoUnit> d2 = Duration.parsePeriod("P2DT5H10M");
LocalDateTime ldt = LocalDateTime.of(2017, 9, 17, 19, 15);
System.out.println(PlainTimestamp.from(ldt).plus(d2)); // 2017-09-20T00:25
System.out.println(PlainTimestamp.of(2017, 9, 17, 19, 15).plus(d2)); // 2017-09-20T00:25
System.out.println(PrettyTime.of(Locale.GERMAN).print(d2)); // 2 Tage, 5 Stunden und 10 Minuten
Duration<IsoUnit> d3 = Duration.parsePeriod("P0001-01-02T05:10:04");
System.out.println(d3); // P1Y1M2DT5H10M4S
LocalDateTime ldt = LocalDateTime.of(2017, 9, 17, 19, 15);
System.out.println(PlainTimestamp.from(ldt).plus(d3)); // 2018-10-20T00:25:04
旁注:实际上 86 种语言都可以设置持续时间的格式。
关于java - 解析 AMAZON.DURATION 插槽类型的 ISO-8601 持续时间值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46258478/
我正在尝试使用普通的 Windows Metro 风格应用程序执行以下操作: public class MyButton : Button { public Duration Duration
有下表 "CREATE TABLE IF NOT EXISTS user_preferences (" + " user_id text,"
假设我有: t := 10 * time.Second // 10s, 当 time.Second 再次应用时,幕后发生了什么? tt := t * time.Second // -2346317h4
在 Java 8 中, Duration 类(class)提供了 toDays 方法,返回总天数作为与日历天无关的 24 小时时间块的计数。 在 Java 9 中,Duration上课得心应手 to…
这很奇怪,经过数小时的测试我仍然无法弄清楚。 好的,这就是我要做的:合并两个视频,也就是一个接一个地追加。 我拍摄了两个视频,然后有两个网址。然后我使用以下方法创建了两个 AVURLAsset: A
正如标题所说,我得到一个字符串'01:23.290',它看起来像一个Duration,但不是。现在我需要用它来与真实的 Duration 进行比较,而我不知道如何处理它。有什么方法吗? 最佳答案 使用
std::chrono::duration的默认构造函数定义如下: constexpr duration() = default; (例如,参见 cppreference.com 或 libstdc+
我正在尝试在我的应用程序中录制视频,我注意到在显示它们的duration 时,我看到了错误的分钟\秒。只有通过以下代码录制的视频才会发生这种情况。通过其他应用录制的视频,时长显示在右侧: publi
我对 AVPlayer.timeControlStatus 属性进行 KVO 处理,播放器有一个 AVPlayerItem。 该视频是托管在远程服务器上的 mpeg4 编码的 10 秒视频文件: le
我正在使用 Spring Reactor Core 3.0.6 并且我有一个返回 Flux 的方法: public Flux createFlux(){ return Flux.,String
当然,我在这里做了一些愚蠢的事情,但我在编译我的简单秒表类时遇到了问题。错误是: /usr/include/c++/4.9/chrono:246:2: error: static assertion
此代码在 gcc-4.8 上编译但在 clang-3.3 上失败?以及如何使这段代码可以在 clang 上编译? =\ #include #include #include void sleep
我正在尝试编写一个允许用户指定 chrono::duration 的函数,例如 chrono::seconds 并返回 chrono 的结果::duration::count. 我可以使用以下模板函数
我不明白在 Go 中划分一个 time.Duration 是什么意思。 例如,这是 super 可爱的: d,_ := time.ParseDuration("4s") fmt.Println(d/4
我是一个初学者程序员,在 scala 中有一个非常简单的问题,我想将一个 long var 转换为 Duration (import scala.concurrent.duration.Duratio
我想知道这两者之间的区别是什么 boost::timed_mutex _mutex; if(_mutex.timed_lock(boost::get_system_time() + boost::po
我正在尝试实现 JUnit 测试来测试参与者。 我有这个 ActorTest : import org.junit.Test; import play.libs.Akka; import playte
假设您有一个涉及两个 Web 应用程序的项目(将共享 DAL/DAO/BO 程序集和一些 OSS 库): 一个半复杂的管理应用程序,使用 Windows Live ID 进行身份验证,并且还能够与各种
根据 moment.js documentation您可以创建 moment 的本地实例,以使用全局设置以外的其他语言环境来格式化日期。 使用 format() 效果很好,但我如何在本地实例上使用 d
我的项目提示“调用中有一个额外的参数‘duration’”。这是它发生的地方 required init(coder aDecoder: NSCoder) { workout = Workou
我是一名优秀的程序员,十分优秀!