将相对时间(以某一时间点为基准,向前或向后以小时为单位)转换为具体时刻

编程语言 2026-07-11

我有一个向量,里面的双精度值表示在午夜之前或之后的小时数:

hours <- c(-2, -1.5, 0, 2.5, 4)

这些值对应于时钟时间:

-2   22:00
-1.5 22:30
 0   00:00
 2.5 02:30
 4   04:00

hours 的数值可以在 -24(前一日午夜)和 24(次日午夜)之间变化,且序列按半小时递增(-24, -23.5, -23, -22.5, -22, ...),也就是说所有时间要么是整点,要么是该小时的半点(00:00, 00:30, 01:00, 01:30, ...)。

如何将相对时间的数字表示转换为HH:MM表示的时间?

HH:MM表示法不应指示它是在前一天午夜之前还是后一天午夜之后(如果有这样的指示,应能很容易从输出中去除,例如用类似 abs(time_of_day)gsub("-", "", time_of_day) 的占位符来表示该关系)。

我的当前解决方案是:

library(hms)
gsub(
    ":00$",
    "",
    as.character(
        hms(
            ifelse(
                hours >= 0,
                hms(hours = hours),
                hms(hours = 24 + hours)
            )
        )
    )
)

这对我来说似乎非常复杂。有没有更简单的方法?


我发现的相关问题没有处理过 负数 的相对数值时间。

解决方案

选项1

你可以使用 as.POSIXct(Sys.Date()) 来获取默认的 00:00:00 本地时间,然后应用偏移量(Hours × 60分钟 × 60秒)

format(as.POSIXct(Sys.Date()) + hours*3600, "%H:%M")

你将看到

[1] "22:00" "22:30" "00:00" "02:30" "04:00"

如果你不介意日期,并且也保持 Date 格式,你可以简单运行

as.POSIXct(Sys.Date()) + hours*3600

得到

[1] "2026-03-10 22:00:00 UTC" "2026-03-10 22:30:00 UTC"
[3] "2026-03-11 00:00:00 UTC" "2026-03-11 02:30:00 UTC"
[5] "2026-03-11 04:00:00 UTC"

选项2

如果你想跳过使用 as.POSIXCT + Sys.Date,而直接操作小时偏移量,可以使用

x <- (hours %% 24)*60
sprintf("%02i:%02i",x%/%60,x%%60)

那么你将得到

[1] "22:00" "22:30" "00:00" "02:30" "04:00"
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章