将小时数转换为HH:MM:SS [r]

时间:2013-11-01 05:07:39

标签: r time format decimal

我正在寻找一种方法将小数小时转换为HH:MM:SS

例如,作为输入:

4.927778 hours

期望的输出:

04:55:40

6 个答案:

答案 0 :(得分:7)

您可以尝试以下内容

dh <- 4.927778
strftime(as.POSIXct(dh * 60 * 60, origin = Sys.Date(), tz = "GMT"), format = "%H:%M:%S")
## [1] "04:55:40"

答案 1 :(得分:1)

另一种解决方案是将其转换为日期/时间类,然后以适当的方式对其进行格式化。

format(ISOdatetime(1900,1,1,0,0,0, tz="GMT") + 
       as.difftime(4.927778, unit="hours"), "%H:%M:%S")

答案 2 :(得分:1)

小时,分钟和秒为整数时,可以根据需要使用sprintf()格式化输出。可以使用模(%%)和floor() / round()来计算。可以使用parse_number()函数从readr包中很好地从字符串中提取小时数:

library(readr) 
input <- "4.927778 hours"
hrs <- parse_number(input)
hours <- floor(hrs)
minutes <- floor((hrs %% 1) * 60)
seconds <- round((((hrs %% 1) * 60) %% 1) * 60)

sprintf("%02d:%02d:%02d", hours, minutes, seconds)

此策略的优势在于,与使用strftime()的解决方案相比,该策略仍然可以处理大于24小时的时差。

答案 3 :(得分:0)

如果你使用的是.net / C#,你可以使用一点日期数学。

var when = DateTime.UtcNow; // or any time of your choice
var later = when.AddHours(4.927778);
var span = later - when;
Console.WriteLine(span)

我现在看到了R标志。也许这会给你一个提示,在哪里寻找类似的东西。我不知道R。

答案 4 :(得分:0)

您应该能够了解自己需要做什么 -

a <- "4.927778 hours"
a <- as.numeric(gsub(x = a,pattern = " hours", replacement = ""))

h <- a%/% 1
m <- ((a%% 1)*60) %/% 1
s <- round((((a%% 1)*60) %% 1)*60,0)
paste(h,m,s,sep = ":")
#[1] "4:55:40"

答案 5 :(得分:0)

这也适用于负值。

convertHours<-function(hours){ timeoffset<-as.numeric(as.POSIXct(format(Sys.time(), tz = "GMT")) - as.POSIXct(format(Sys.time(), tz = ""))) hoursMinutes<-ifelse(hours<0,paste0("-",strftime(as.POSIXct((abs(hours)+timeoffset) * 60 * 60, origin = Sys.Date(), tz =""), format = "%H:%M")), strftime(as.POSIXct((hours+timeoffset) * 60 * 60, origin = Sys.Date(), tz =""), format = "%H:%M")) }

  

H&LT; -1.33

     

HHMM&LT; -convertHours(H)

     

hhmm [1]“01:19”

     

H&LT; - 1.33

     

HHMM&LT; -convertHours(H)

     

hhmm [1]“ - 01:19”