将十进制的天数转换为年、月、日、小时、分钟和秒

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

我有:

电子表格,其中 C 列包含十进制格式的天数。

我需要什么:

我需要 E 列将 C 列的值转换为年、月、日、小时、分钟和秒。

我尝试过的:

以下公式代表年、日和月,但不代表时、分和秒。

=INT(C9/365)&" Years, "&INT(MOD(C9,365)/30)&" Months, "&ROUND(MOD((MOD(C9,365)),30),0)&" Days"

我的问题:

使用上面的公式,我怎样才能表示小时、分钟和秒呢?我无法理解嵌套和舍入的意义。

excel worksheet-function calculation date-math date-manipulation
4个回答
0
投票

执行此操作的一个简单方法是使用

TEXT
函数为您提供小时、分钟和秒(与
ian0411's
注释相同),因此使用原始公式的稍微修改版本:

=INT(C9/365)&" Years, "&INT(MOD(C9,365)/30)&" Months, "&INT(MOD(MOD(C9,365),30))&" Days "&TEXT(C9,"h:mm:ss")

或者如果你想拼出单位,你可以使用这个版本

=INT(C9/365)&" Years, "&INT(MOD(C9,365)/30)&" Months, "&INT(MOD(MOD(C9,365),30))&" Days"&TEXT(C9," h"" Hours ""m"" Minutes ""s"" Seconds""")

请注意,

TEXT
函数是特定于语言的,因此对于非英语 Excel 版本
h:mm:ss
可能需要更改


0
投票

让 Excel 为您计算! ...使用
TEXT
函数。

DATEDIF
函数(类似于VBA的
DateDiff
函数)是计算整年、月、日、小时等的快速方法。

最好将值存储为“天数”(只要有可能就应该这样做,因为 Excel 以相同的方式存储日期。

TEXT
工作表函数(或 VBA 中的
FORMAT
函数)可用于格式化持续时间和时间跨度,就像格式化日期和时间一样。

例如:

如果单元格

A1
包含您想要格式的值,例如
12345
(12,345天),您可以使用:

=TEXT(A1,"y \yr, M \m, d \d")

...将会返回:

33 yr, 10 m, 18 d

使用

Y,M,D,H,M,S
等指定日期/时间值的位置。您可以在数字之间指定您想要的任何内容;如果您想要的字母是上面列出的字母之一,您可以在前面放置一个
\
以强制显示该字母(如上例中的
d


如果您在

A1
中的值包含部分日期,例如
12345.6789
,您可以使用以下方式进行转换:

=TEXT(A1,"y \yr, M \m, d \d, h \hr, m \m, s \s")

...返回:

33 yr, 10 m, 18 d, 16 hr, 17 m, 37 s

🌟未记录的工作表功能:
DATEDIF

有一个未记录的工作表函数,称为

DATEDIF
(类似于 VBA 的
DATEDIFF
函数),可以快速计算年、月、日、小时等之间的差异...


DATEDIF 被视为 Formula 家族的醉酒表弟。Excel 知道它过着幸福而有用的生活,但不会在礼貌的谈话中谈论它。” — Chip Pearson

用途:

DATEDIF的语法如下:

=DATEDIF(
Date1,
Date2,
Interval
)

地点:
-

Date1
是第一次约会。
-
Date2
是第二次约会。
-
Interval
是要返回的间隔类型。

Code  Meaning                         Complete 'calendar' days/months/years        
---- ------------------------------- -------------------------------------------------------------- 
 m    Months                          Months between the dates
 d    Days                            Days between the dates
 y    Years                           Years between the dates
 ym   Months Excluding Years          Months between the dates as if they were of the same year
 yd   Days Excluding Years            Days between the dates as if they were of the same year
 md   Days Excluding Years & Months   Days between the dates as if they were of the same month & year


0
投票

我知道这个问题很旧,但只是想补充一下。某些 Excel 版本现在缺少

DATEDIF
功能。在这种情况下,只要您可以访问
LET
函数,下面这个不太简单的公式就可以解决问题:

=LET(
startDate, C1,
endDate, D1,
dp, 10,
relDateA, DATE(YEAR(endDate),MONTH(startDate),DAY(startDate)) + TIME(HOUR(startDate),MINUTE(startDate),SECOND(startDate)),
relDateB, DATE(YEAR(endDate)-1,MONTH(startDate),DAY(startDate)) + TIME(HOUR(startDate),MINUTE(startDate),SECOND(startDate)),
relDate, IF(endDate>=DATE(YEAR(endDate),MONTH(startDate),DAY(startDate)), relDateA, relDateB),
ageYr, IF(relDate=relDateA, YEAR(endDate)-YEAR(startDate), YEAR(endDate)-YEAR(startDate)-1),
nDaysMth, EDATE(relDate,SEQUENCE(12,,2)) - EDATE(relDate,SEQUENCE(12)),
cumNDays, MAP(SEQUENCE(ROWS(nDaysMth)), LAMBDA(val, SUM(TAKE(nDaysMth,val)))),
cumDays, INT(endDate) - INT(relDate) + (NUMBERVALUE(TIMEVALUE(TEXT(endDate,"hh:mm:ss"))) - NUMBERVALUE(TIMEVALUE(TEXT(startDate,"hh:mm:ss")))),
ageMth, IFNA(MATCH(cumDays, cumNDays,1),0),
ageWk, (cumDays-IFNA(INDEX(cumNDays,MATCH(cumDays, cumNDays,1)),0))/7,
ageDay, (ageWk-INT(ageWk))*7,
ageHr, ROUND((ageDay-INT(ageDay)),dp)*24,
ageMin, ROUND((ageHr-INT(ageHr)),dp)*60,
ageSec, ROUND((ageMin-INT(ageMin)),dp)*60,
ageMSec, ROUND((ageSec-INT(ageSec)),3)*1000,
ageInt, INT(VSTACK(ageYr, ageMth, ageWk, ageDay, ageHr, ageMin, ageSec, ageMSec)),
ageLabel, VSTACK("year", "month", "week", "day", "hour", "minute", "second", "millisecond") & IF(ageInt=1,"","s"),
ageArr, TEXTJOIN(" ", TRUE, FILTER(ageInt & ageLabel, ageInt<>0)),
IF(SUM(ageInt)=0, "0millisecond", ageArr)
)

要支持一维数组作为输入,您可以应用映射函数(如果您有权访问它),如下所示:

=LET(
startDate, C1#,
endDate, D1#,
dp, 10,
MAP(startDate, endDate, LAMBDA(startDate,endDate,
LET(
relDateA, DATE(YEAR(endDate),MONTH(startDate),DAY(startDate)) + TIME(HOUR(startDate),MINUTE(startDate),SECOND(startDate)),
relDateB, DATE(YEAR(endDate)-1,MONTH(startDate),DAY(startDate)) + TIME(HOUR(startDate),MINUTE(startDate),SECOND(startDate)),
relDate, IF(endDate>=DATE(YEAR(endDate),MONTH(startDate),DAY(startDate)), relDateA, relDateB),
ageYr, IF(relDate=relDateA, YEAR(endDate)-YEAR(startDate), YEAR(endDate)-YEAR(startDate)-1),
nDaysMth, EDATE(relDate,SEQUENCE(12,,2)) - EDATE(relDate,SEQUENCE(12)),
cumNDays, MAP(SEQUENCE(ROWS(nDaysMth)), LAMBDA(val, SUM(TAKE(nDaysMth,val)))),
cumDays, INT(endDate) - INT(relDate) + (NUMBERVALUE(TIMEVALUE(TEXT(endDate,"hh:mm:ss"))) - NUMBERVALUE(TIMEVALUE(TEXT(startDate,"hh:mm:ss")))),
ageMth, IFNA(MATCH(cumDays, cumNDays,1),0),
ageWk, (cumDays-IFNA(INDEX(cumNDays,MATCH(cumDays, cumNDays,1)),0))/7,
ageDay, (ageWk-INT(ageWk))*7,
ageHr, ROUND((ageDay-INT(ageDay)),dp)*24,
ageMin, ROUND((ageHr-INT(ageHr)),dp)*60,
ageSec, ROUND((ageMin-INT(ageMin)),dp)*60,
ageMSec, ROUND((ageSec-INT(ageSec)),3)*1000,
ageInt, INT(VSTACK(ageYr, ageMth, ageWk, ageDay, ageHr, ageMin, ageSec, ageMSec)),
ageLabel, VSTACK("year", "month", "week", "day", "hour", "minute", "second", "millisecond") & IF(ageInt=1,"","s"),
ageArr, TEXTJOIN(" ", TRUE, FILTER(ageInt & ageLabel, ageInt<>0)),
IF(SUM(ageInt)=0, "0millisecond", ageArr)
))))

-1
投票

也许这是一种更有效的方法,但我相信这应该可行。如果不行就留下评论,我们可以解决。

时间

=INT((C9-INT(C9))*24)

分钟

=INT((((C9-INT(C9))*24)-INT((C9-INT(C9))*24))*60)

=ROUNDDOWN((((((C9-INT(C9))*24)-INT((C9-INT(C9))*24))*60)-INT(((((C9-INT(C9))*24)-INT((C9-INT(C9))*24))*60)))*60,0)

整个事情

=INT(C9/365)&" Years, "&INT(MOD(C9,365)/30)&" Months, "&ROUND(MOD((MOD(C9,365)),30),0)&" Days,  "&INT((C9-INT(C9))*24)& " Hours,  "&INT((((C9-INT(C9))*24)-INT((C9-INT(C9))*24))*60)&" Minutes, "&ROUNDDOWN((((((C9-INT(C9))*24)-INT((C9-INT(C9))*24))*60)-INT(((((C9-INT(C9))*24)-INT((C9-INT(C9))*24))*60)))*60,0)&" Seconds"

编辑:

ROUNDDOWN
而不是
ROUND
几分钟(可以关闭一秒的一部分)并包含完整的公式

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