我正在寻找一种从“ISO 8601持续时间格式”(P0DT0H0M0S)转换为小时的便捷方法。
到目前为止,我想到了这个:
# Example in BigQuery
SELECT
24 * CAST(SPLIT(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE('P1DT2H3M44S', 'P', ''), 'DT', '-'), 'H', '-'), 'M', '-'), 'S', ''), '-')[OFFSET(0)] AS INT64)
+ CAST(SPLIT(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE('P1DT2H3M44S', 'P', ''), 'DT', '-'), 'H', '-'), 'M', '-'), 'S', ''), '-')[OFFSET(1)] AS INT64)
+ (1/60) * CAST(SPLIT(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE('P1DT2H3M44S', 'P', ''), 'DT', '-'), 'H', '-'), 'M', '-'), 'S', ''), '-')[OFFSET(2)] AS INT64)
+ (1/3600) * CAST(SPLIT(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE('P1DT2H3M44S', 'P', ''), 'DT', '-'), 'H', '-'), 'M', '-'), 'S', ''), '-')[OFFSET(3)] AS INT64) AS HOURS
如您所见,我的方法是将数字拆分并乘以24、1、1/60、1/3600以得到小时。我可以减少代码量吗?
样本数据和所需结果
输入: 'P1DT2H3M44S' (1 天 2 小时 3 分 44 秒)
期望输出: 26.062222222222222 (这是小时)
这个选项比原始代码更简洁,但仍然易于理解和修改。
SELECT
'P0DT5H47M0S' AS iso_8601_duration,
24 * CAST(REGEXP_EXTRACT('P0DT5H47M0S', '[0-9]+', 1, 1) AS INT64)
+ 1 * CAST(REGEXP_EXTRACT('P0DT5H47M0S', '[0-9]+', 1, 2) AS INT64)
+ (1/60) * CAST(REGEXP_EXTRACT('P0DT5H47M0S', '[0-9]+', 1, 3) AS INT64)
+ (1/3600) * CAST(REGEXP_EXTRACT('P0DT5H47M0S', '[0-9]+', 1, 4) AS INT64) AS Hours
尝试下面的选项
select *,
(select sum(cast(val as int64) * weight)
from unnest(regexp_extract_all(col, r'\d+')) val with offset
join unnest([24, 1, 1/60, 1/3600]) weight with offset
using(offset)
) as hours
from `project.dataset.table`
如果应用到您的问题中的样本数据,输出是
上面假设所有部分(天,小时,分钟,秒)都存在,即使它们为零
如果不是这种情况-我怀疑是这样,但不确定-则需要对上述解决方案进行轻微调整。让我知道
我有ISO8601格式的持续时间值,我将其转换为时间值为整数秒,如下所示: ISO8601格式的持续时间值=“P1Y”。 我将该值存储在“时间-单位-秒”中。因此,当我检索的值将是在int,我想转换回ISO8601持续时间格式,所以我应该得到“P1Y”转换后回来。 有没有快速的方法可以做到这一点?或者我必须把时间的int值转换成float,然后通过某种方法把它转换成ISO8601持续时间。
有很多问题询问如何以另一种方式执行此操作(从这种格式转换),但我找不到有关如何在PHP中以ISO 8601持续时间格式输出的任何内容。 所以我有一堆可读格式的持续时间字符串——我想动态地将它们转换成ISO 8601格式,以打印HTML5微数据的持续时间。下面是一些输入字符串的示例,以及它们应该如何格式化 我可以在PHP中将字符串推入间隔对象: 但似乎没有ISO 8601输出选项 我应该如何处理这个
我如何转换 00:00:46.70 到 T0M46S 我尝试 但它给了我这样的东西: PT0H00M 注意我想要持续时间...不是日期!
目前,当您获得youtube持续时间时,您会获得类似的内容。 下面的代码将其更改为。然而,我希望只获得SECONDS,因此将是输出。
我正在将一个项目从Joda Time过渡到java8的本机时间库,我遇到了一个障碍。 我一直找不到持续时间的格式化程序。我想有一个自定义的字符串格式,例如HHH MM,其中75小时15分钟的持续时间将格式化为“75 15”。 通过转换为句点并使用句点Formatter,Joda-Time很容易做到这一点,但是我无法在Java8中找到这种类型的类。我错过了什么吗?
我正试图使用时刻持续时间格式设置倒计时计时器的格式,但一旦时间达到60分钟以下,小时就会消失,例如60分钟显示为“01:00”,这是正确的59分钟显示为“59”,这是不正确的,它应该显示为“00:59” 其中3500000毫秒等于58分钟 我有以下代码: 显示结果:58,而不是00:58 我到底做错了什么? 我也尝试过这种变化,但没有任何效果