ISO 持续时间格式到谷歌表格

问题描述 投票:0回答:1

请告诉我如何将ISO 8601持续时间(P2Y3M4DT1H2M1S)格式转换为Google表格中的小时,前提是某些字母可能不是(P1D,PT2H)等。也许谷歌表格中有一个公式?先谢谢你了

通过chatgpt尝试过但没有成功

datetime google-sheets google-sheets-formula iso8601
1个回答
0
投票

我相信我已经为你找到了解决方案,尽管目前还不清楚你到底想要什么格式。

=LET(stamp,REGEXEXTRACT(A1,"(-)?P(?:([.,\d]+)Y)?(?:([.,\d]+)M)?(?:([.,\d]+)W)?(?:([.,\d]+)D)?(?:T(?:([.,\d]+)H)?(?:([.,\d]+)M)?(?:([.,\d]+)S)?)?"),
IFNA(LET(year, INDEX(stamp,2),
month,INDEX(stamp,3),
days,INDEX(stamp,5),
hours,INDEX(stamp,6),
minutes,INDEX(stamp,7),
seconds,INDEX(stamp,8),
LET(total_seconds,days*24*60*60+hours*60*60+minutes*60+seconds,
LET(format_seconds,MOD(total_seconds,60),
LET(total_minutes,QUOTIENT(total_seconds-format_seconds,60),
LET(format_minutes,MOD(total_minutes,60),format_hours,QUOTIENT(total_minutes,60),
format_hours&":"&format_minutes&":"&format_seconds))))),))

使用

P3Y6M4DT12H30M5S
进行测试返回
108:30:5

将其分为几个部分:

IFNA(..., )

表示如果与正则表达式不匹配,则返回空白单元格。

REGEXEXTRACT(A1,"(-)?P(?:([.,\d]+)Y)?(?:([.,\d]+)M)?(?:([.,\d]+)W)?(?:([.,\d]+)D)?(?:T(?:([.,\d]+)H)?(?:([.,\d]+)M)?(?:([.,\d]+)S)?)?")

将所有相关数字提取到一个数组中。 正则表达式取自此处

LET(year, INDEX(stamp,2),
month,INDEX(stamp,3),
days,INDEX(stamp,5),
hours,INDEX(stamp,6),
minutes,INDEX(stamp,7),
seconds,INDEX(stamp,8),

提取这些特定位置的数字。
请注意,年份和月份不会在以后使用,因为您无法准确判断是哪一年或哪一年。

LET(total_seconds,days*24*60*60+hours*60*60+minutes*60+seconds

这只是将所有相关值转换为秒。如果您想采用其他格式,从秒开始可以更轻松地更改它。

LET(format_seconds,MOD(total_seconds,60),
LET(total_minutes,QUOTIENT(total_seconds-format_seconds,60),
LET(format_minutes,MOD(total_minutes,60),format_hours,QUOTIENT(total_minutes,60),
format_hours&":"&format_minutes&":"&format_seconds

这会将秒转换为

HH:MM:SS
的格式,允许小时超过 24,也允许小数秒。


可以同时在整个范围内工作的版本如下:

=MAP(A1:A6,LAMBDA(full_stamp,LET(stamp,REGEXEXTRACT(full_stamp,"(-)?P(?:([.,\d]+)Y)?(?:([.,\d]+)M)?(?:([.,\d]+)W)?(?:([.,\d]+)D)?(?:T(?:([.,\d]+)H)?(?:([.,\d]+)M)?(?:([.,\d]+)S)?)?"),
IFNA(LET(year, INDEX(stamp,2),
month,INDEX(stamp,3),
days,INDEX(stamp,5),
hours,INDEX(stamp,6),
minutes,INDEX(stamp,7),
seconds,INDEX(stamp,8),
LET(total_seconds,days*24*60*60+hours*60*60+minutes*60+seconds,
LET(format_seconds,MOD(total_seconds,60),
LET(total_minutes,QUOTIENT(total_seconds-format_seconds,60),
LET(format_minutes,MOD(total_minutes,60),format_hours,QUOTIENT(total_minutes,60),
format_hours&":"&format_minutes&":"&format_seconds
))))),))))

只需将A1:A6更改为相关范围即可。

© www.soinside.com 2019 - 2024. All rights reserved.