我对铁 rust 和超时空图书馆还是个新手。我检查了https://docs.rs/chrono/0.4.19/chrono/struct.Duration.html#method.num_weeks,但是在时间::持续时间中没有num_years()或num_months() API。对此是否有任何变通解决方案?
num_years()
num_months()
icomxhvb1#
chrono::Duration提供了“ISO 8601纳秒精度持续时间”中的日期和持续时间,这意味着它在内部将持续时间表示为纳秒数,然后提供了转换为其他持续时间单位(如天、周、毫秒等)的方便方法。这与实际的ISO 8601持续时间标准有点矛盾,ISO 8601持续时间标准是一种表示和格式标准。该标准用P[n]Y[n]M[n]DT[n]H[n]M[n]S格式表示持续时间-这可能会给予您想要的结果。但这不是chronos::Duration设计时所提供的结果。问题是,为了表示月或年的持续时间,需要比纳秒数更多的信息。持续时间定义了时间间隔中的干预时间量:两点之间的时间。2开始或结束时间很重要,因为月或年不是标准的持续时间。3月有28、29、30、31天,年有365和366天。如果您要编写自己的算法,以年、月、日、小时、分钟、秒等格式设置持续时间,则必须知道开始日期。此外,时区也很重要,因为需要考虑夏令时。您还必须决定如何表示月或年的一部分。例如,一月有31天,比如说2月28日。从1月1日算起的1.75个月的持续时间是什么意思?这是否意味着1月是31天,而2月是0.75 * 28天?或者,您可以使用级联单位格式表示从开始日期开始的持续时间:例如,自1970年1月1日12:00 Z起5年4个月3天2小时12分3秒。与ISO 8601标准相同。所以,这并不是一个简单的解决方案,这完全取决于您的需求是什么。我可以理解为什么chronos:Duration的开发人员停止提供num_months()和num_years()!
hi3rlvi22#
板条箱chronoutil提供RelativeDuration,这是 “延长时间的持续时间,以增加月和年”。示例来自docs.rs:
chronoutil
RelativeDuration
let one_day = RelativeDuration::days(1); let one_month = RelativeDuration::months(1); let delta = one_month + one_day; let start = NaiveDate::from_ymd(2020, 1, 30); assert_eq!(start + delta, NaiveDate::from_ymd(2020, 3, 1));
2条答案
按热度按时间icomxhvb1#
chrono::Duration提供了“ISO 8601纳秒精度持续时间”中的日期和持续时间,这意味着它在内部将持续时间表示为纳秒数,然后提供了转换为其他持续时间单位(如天、周、毫秒等)的方便方法。
这与实际的ISO 8601持续时间标准有点矛盾,ISO 8601持续时间标准是一种表示和格式标准。该标准用P[n]Y[n]M[n]DT[n]H[n]M[n]S格式表示持续时间-这可能会给予您想要的结果。但这不是chronos::Duration设计时所提供的结果。
问题是,为了表示月或年的持续时间,需要比纳秒数更多的信息。持续时间定义了时间间隔中的干预时间量:两点之间的时间。2开始或结束时间很重要,因为月或年不是标准的持续时间。3月有28、29、30、31天,年有365和366天。
如果您要编写自己的算法,以年、月、日、小时、分钟、秒等格式设置持续时间,则必须知道开始日期。此外,时区也很重要,因为需要考虑夏令时。您还必须决定如何表示月或年的一部分。例如,一月有31天,比如说2月28日。从1月1日算起的1.75个月的持续时间是什么意思?这是否意味着1月是31天,而2月是0.75 * 28天?
或者,您可以使用级联单位格式表示从开始日期开始的持续时间:例如,自1970年1月1日12:00 Z起5年4个月3天2小时12分3秒。与ISO 8601标准相同。
所以,这并不是一个简单的解决方案,这完全取决于您的需求是什么。我可以理解为什么chronos:Duration的开发人员停止提供num_months()和num_years()!
hi3rlvi22#
板条箱
chronoutil
提供RelativeDuration
,这是 “延长时间的持续时间,以增加月和年”。示例来自docs.rs: