时间是一个非常简单的概念。一秒过去了,一个接一个,都一样。但人类喜欢把它弄得很难。这个堆叠溢出问题收集了许多答案,尽管它们的长度和复杂性令人惊讶,但对于某些输入,它们中的大多数仍然会失败。你能将数秒格式化成供人类消费的时间戳吗?不仅准确,而且正确?
从浮点数秒数构建人类可读的时间戳。时间戳必须格式化为hh:mm:ss.zzz。单数小时、分钟和秒必须用前导零格式化。如果完整小时数为零,则必须省略小时数和前导冒号,使输出格式为mm:ss.zzz。请注意,小时数可能超过两位数。对于不能表示为有限数的输入,结果必须是--:--.--- (可能适用于您的语言的示例请参见下面)。这是code-golf,所以以字节为单位的最短代码获胜。
0 -> 00:00.000
-0 -> 00:00.000
1 -> 00:01.000
-1 -> -00:01.000
0.001 -> 00:00.001
3.141528 -> 00:03.142
3600 -> 01:00:00.000
3599.9995 -> 01:00:00.000
363600 -> 101:00:00.000
17999.9999 -> 05:00:00.000
Infinity -> --:--.---
-Infinity -> --:--.---
NaN -> --:--.---发布于 2022-06-03 10:08:28
f=n=>1/n?n<0?'-'+f(-n):(n=n*1e3+.5,(k=n/36e5|0)?k>9?k:'0'+k:'')+new Date(n).toJSON().slice(13+!k,-1):'--:--.---'我们使用toJSON()方法直接以预期格式提取分钟、秒和毫秒。这样的日期表示总是以UTC表示,因此我们不必费心于系统时区。
1970-01-01T00:00:00.000Z
\_______/时间是手动格式化的。除非没有完整的小时,而且字段根本没有插入,否则上面字符串中的前导冒号也会被包括在内。
发布于 2022-06-04 03:36:40
t=n=>(f=parseInt,O='0',p=n<0?(n=-n,'-'):'',h=f(n/3600),m=f(n/60%60),s=(n%60).toFixed(3),n-n==0?p+(h?(h>9?h:O+h)+':':'')+(m>9?m:O+m)+':'+(s<10?O+s:s):'--:--.---')如果我使用|0来截断h & m,我可以节省13个字节,但我认为这会导致它在非常大的数字上失败(例如,Number.MAX_SAFE_INTEGER/3600|0 === -1966140585 )。
而且,这有点傻,但我认为,如果箭头函数被替换成一个普通的箭头函数,它甚至可以在只使用ES3的旧引擎中工作?(另一个JS答案使用.toJSON,我相信它是在ES5中添加的)。
(n => (
// constants
f = parseInt,
O = '0',
// variables
p = n<0?(n=-n,'-'):'',
h = f(n/3600),
m = f(n/60%60),
s = (n%60).toFixed(3),
// return value
n-n==0
? p+(h?(h>9?h:O+h)+':':'')+(m>9?m:O+m)+':'+(s<10?O+s:s)
: '--:--.---'
) )发布于 2022-06-03 16:04:57
function d(i),if~isfinite(i),'--:--.---',end,f='hh:mm:ss.SSS';if abs(i)<3600,f=f(4:12);end,i=seconds(i);i.Format=f使用MATLAB内置的“持续时间”类(及其导数,秒),我可以将浮动输入i转换为持续时间,并将输出格式更改为适合于挑战的格式。如果输入是nan或inf,则持续时间将显示为nan或inf,因此我对异常字符串进行了硬编码。
TIO没有MATLAB,但是八度,和八度没有内置的‘秒’类,所以我不能显示一个TIO链接。
https://codegolf.stackexchange.com/questions/248155
复制相似问题