将以秒为单位的时间间隔转换为更易读的形式

Posted

技术标签:

【中文标题】将以秒为单位的时间间隔转换为更易读的形式【英文标题】:Convert time interval given in seconds into more human readable form 【发布时间】:2012-01-02 22:45:02 【问题描述】:

我需要一个代码 sn-p 用于将由秒数给出的时间量转换为某种人类可读的形式。该函数应该接收一个数字并输出一个字符串,如下所示:

34 seconds 
12 minutes 
4 hours 
5 days 
4 months
1 year

不需要格式化,硬编码的格式会去。

【问题讨论】:

How to convert milliseconds into human readable form?的可能重复 是的,不是的,我在想有一个很好的 javascript 解决方案来解决这个问题...... 秒是人类可读的形式。 嗯,“213123 秒”不太可读。你可以提出一个更好的标题 【参考方案1】:
 function secondsToString(seconds)

var numyears = Math.floor(seconds / 31536000);
var numdays = Math.floor((seconds % 31536000) / 86400); 
var numhours = Math.floor(((seconds % 31536000) % 86400) / 3600);
var numminutes = Math.floor((((seconds % 31536000) % 86400) % 3600) / 60);
var numseconds = (((seconds % 31536000) % 86400) % 3600) % 60;
return numyears + " years " +  numdays + " days " + numhours + " hours " + numminutes + " minutes " + numseconds + " seconds";


【讨论】:

谢谢!如果您添加复数检查(年/年),那将是完美的! 感谢您的帮助,罗伊。请参阅下面的答案,它完全回答了我的问题 还有神奇的数字:secondsInAYear = 31536000; secondsInADay = 86400; secondsInAnHour = 3600; secondsInAMinute = 60; 注意:这不考虑闰年,只提供“时间跨度”的值。 (((seconds % 31536000) % 86400) % 3600) % 60 === seconds % 60 这样你就可以保存一些会在你的cpu中死掉的位var numyears = Math.floor(seconds / 31536000); var numdays = Math.floor((seconds % 31536000) / 86400); var numhours = Math.floor((seconds % 86400) / 3600); var numminutes = Math.floor((seconds % 3600) / 60); var numseconds = seconds % 60;【参考方案2】:

在 Royi 的帮助下,我们得到了以人类可读形式输出时间间隔的代码:

function millisecondsToStr (milliseconds) 
    // TIP: to find current time in milliseconds, use:
    // var  current_time_milliseconds = new Date().getTime();

    function numberEnding (number) 
        return (number > 1) ? 's' : '';
    

    var temp = Math.floor(milliseconds / 1000);
    var years = Math.floor(temp / 31536000);
    if (years) 
        return years + ' year' + numberEnding(years);
    
    //TODO: Months! Maybe weeks? 
    var days = Math.floor((temp %= 31536000) / 86400);
    if (days) 
        return days + ' day' + numberEnding(days);
    
    var hours = Math.floor((temp %= 86400) / 3600);
    if (hours) 
        return hours + ' hour' + numberEnding(hours);
    
    var minutes = Math.floor((temp %= 3600) / 60);
    if (minutes) 
        return minutes + ' minute' + numberEnding(minutes);
    
    var seconds = temp % 60;
    if (seconds) 
        return seconds + ' second' + numberEnding(seconds);
    
    return 'less than a second'; //'just now' //or other string you like;

【讨论】:

这是错误的。对于像'3 day 0 hour 50 minutes 36 seconds'这样的时间,它只会得到'3 day',因为它在小时恰好是“0”时返回。【参考方案3】:

如果您对能够很好地完成这项工作的现有 javascript 库感兴趣,您可能需要查看moment.js。

更具体地说,与您的问题相关的 moment.js 片段是 durations。

以下是一些示例,说明如何利用它来完成任务:

var duration = moment.duration(31536000);

// Using the built-in humanize function:
console.log(duration.humanize());   // Output: "9 hours"
console.log(duration.humanize(true));   // Output: "in 9 hours"

moment.js 内置支持 50 多种人类语言,因此如果您使用 humanize() 方法,您将免费获得多语言支持。

如果您想显示准确的时间信息,您可以利用专门为此目的创建的 moment.js 的 moment-precise-range 插件:

console.log(moment.preciseDiff(0, 39240754000);
// Output: 1 year 2 months 30 days 5 hours 12 minutes 34 seconds

需要注意的一点是,目前 moment.js 不支持持续时间对象的周数/天数(以周为单位)。

希望这会有所帮助!

【讨论】:

这很不精确。 moment.duration(40, 'seconds') 产生 'a few seconds'moment.duration(45, 'seconds') 产生 'a minute'。 see this Feature request 太棒了!非常感谢!【参考方案4】:

根据@Royi 的回复试了一下:

/**
 * Translates seconds into human readable format of seconds, minutes, hours, days, and years
 * 
 * @param  number seconds The number of seconds to be processed
 * @return string         The phrase describing the amount of time
 */
function forHumans ( seconds ) 
    var levels = [
        [Math.floor(seconds / 31536000), 'years'],
        [Math.floor((seconds % 31536000) / 86400), 'days'],
        [Math.floor(((seconds % 31536000) % 86400) / 3600), 'hours'],
        [Math.floor((((seconds % 31536000) % 86400) % 3600) / 60), 'minutes'],
        [(((seconds % 31536000) % 86400) % 3600) % 60, 'seconds'],
    ];
    var returntext = '';

    for (var i = 0, max = levels.length; i < max; i++) 
        if ( levels[i][0] === 0 ) continue;
        returntext += ' ' + levels[i][0] + ' ' + (levels[i][0] === 1 ? levels[i][1].substr(0, levels[i][1].length-1): levels[i][1]);
    ;
    return returntext.trim();

我的好处是没有重复的ifs,例如不会给你0年0天30分1秒

例如:

forHumans(60) 输出1 minute

forHumans(3600) 输出1 hour

forHumans(13559879) 输出156 days 22 hours 37 minutes 59 seconds

【讨论】:

你会如何让它对英语更友好,比如forHumans(13559879) -> 156 days, 22 hours, 37 minutes, and 59 seconds?这应该是公认的答案。 链接已损坏【参考方案5】:

尝试以下操作:

seconds = ~~(milliseconds / 1000);
minutes = ~~(seconds / 60);
hours = ~~(minutes / 60);
days = ~~(hours / 24);
weeks = ~~(days / 7);
year = ~~(days / 365);

注意:

通常一年有 365 天。闰年有 366 天,因此您需要额外检查这是否对您造成影响。 与夏令时类似的问题。有些日子是 23 小时,有些是 25 小时,时间会改变。

结论:这是一个粗鲁但又小又简单的 sn-p :)

【讨论】:

根据 bemchmark 测试显示 parseInt 太慢了,稍微重写了你的代码 这不起作用。例如,如果毫秒是 300000(5 分钟),那么这给出了毫秒=300000,秒=300,分钟=5,这不是 OP 请求的输出。 jsfiddle.net/yp6fcacs【参考方案6】:

更简单易读。

milliseconds = 12345678;
mydate=new Date(milliseconds);
humandate=mydate.getUTCHours()+" hours, "+mydate.getUTCMinutes()+" minutes and "+mydate.getUTCSeconds()+" second(s)";

这给出了:

“3 小时 25 分 45 秒”

【讨论】:

这是一个很好的答案,如果我需要输出 date 'Anno Domini',这将是公认的答案。相反,我需要将 时间间隔 转换为像 1 month ago 这样的字符串。完全是我的错,我的问题不清楚。多亏了你,它被注意到了,问题也被更新了。 对于那些必须处理日期和时间间隔的人来说,这是一个非常有趣的陷阱。如果我们从 0 开始计算纪元,而不是从 1970 年开始,那么这个问题就不存在了。 您的代码运行良好,直到间隔不到一年,并且不考虑夏令时 @Dan 我是故意这样做的。考虑到夏令时,从最后一行中删除 UTC。【参考方案7】:
millisToTime = function(ms)

    x = ms / 1000;
    seconds = Math.round(x % 60);
    x /= 60;
    minutes = Math.round(x % 60);
    x /= 60;
    hours = Math.round(x % 24);
    x /= 24;
    days = Math.round(x);

    return "Days" : days, "Hours" : hours, "Minutes" : minutes, "Seconds" : seconds;

这将花费毫秒作为 int,并为您提供一个 JSON 对象,其中包含您可能需要的所有信息

【讨论】:

感谢您的功能。就我而言,我必须将 Math.round(x) 更改为 Math.floor(x) 才能获得我需要的数字。【参考方案8】:

以毫秒为单位的时间转换为人类可读的格式。

 function timeConversion(millisec) 

        var seconds = (millisec / 1000).toFixed(1);

        var minutes = (millisec / (1000 * 60)).toFixed(1);

        var hours = (millisec / (1000 * 60 * 60)).toFixed(1);

        var days = (millisec / (1000 * 60 * 60 * 24)).toFixed(1);

        if (seconds < 60) 
            return seconds + " Sec";
         else if (minutes < 60) 
            return minutes + " Min";
         else if (hours < 24) 
            return hours + " Hrs";
         else 
            return days + " Days"
        
    

【讨论】:

我一直最喜欢这种风格【参考方案9】:

感谢@Dan / @Royi 的逻辑。但是,该实现不会像 XX 天,XX 分钟那样构建时间字符串。我稍微调整了他们的代码:

function millisecondsToStr( milliseconds ) 
    let temp = milliseconds / 1000;
    const years = Math.floor( temp / 31536000 ),
          days = Math.floor( ( temp %= 31536000 ) / 86400 ),
          hours = Math.floor( ( temp %= 86400 ) / 3600 ),
          minutes = Math.floor( ( temp %= 3600 ) / 60 ),
          seconds = temp % 60;

    if ( days || hours || seconds || minutes ) 
      return ( years ? years + "y " : "" ) +
      ( days ? days + "d " : "" ) +
      ( hours ? hours + "h " : ""  ) +
      ( minutes ? minutes + "m " : "" ) +
      Number.parseFloat( seconds ).toFixed( 2 ) + "s";
    

    return "< 1s";

当你运行它时

console.log("=", millisecondsToStr( 1540545689739 - 1540545684368 ));
console.log("=", millisecondsToStr( 351338536000 ));

结果如下:

= 5.37s
= 11y 51d 10h 2m 16.00s

【讨论】:

【参考方案10】:
function millisecondsToString(milliseconds) 
    var oneHour = 3600000;
    var oneMinute = 60000;
    var oneSecond = 1000;
    var seconds = 0;
    var minutes = 0;
    var hours = 0;
    var result;

    if (milliseconds >= oneHour) 
        hours = Math.floor(milliseconds / oneHour);
    

    milliseconds = hours > 0 ? (milliseconds - hours * oneHour) : milliseconds;

    if (milliseconds >= oneMinute) 
        minutes = Math.floor(milliseconds / oneMinute);
    

    milliseconds = minutes > 0 ? (milliseconds - minutes * oneMinute) : milliseconds;

    if (milliseconds >= oneSecond) 
        seconds = Math.floor(milliseconds / oneSecond);
    

    milliseconds = seconds > 0 ? (milliseconds - seconds * oneSecond) : milliseconds;

    if (hours > 0) 
        result = (hours > 9 ? hours : "0" + hours) + ":";
     else 
        result = "00:";
    

    if (minutes > 0) 
        result += (minutes > 9 ? minutes : "0" + minutes) + ":";
     else 
        result += "00:";
    

    if (seconds > 0) 
        result += (seconds > 9 ? seconds : "0" + seconds) + ":";
     else 
        result += "00:";
    

    if (milliseconds > 0) 
        result += (milliseconds > 9 ? milliseconds : "0" + milliseconds);
     else 
        result += "00";
    

    return result;

【讨论】:

【参考方案11】:

此函数以这种格式输出秒数:11h 22m、1y 244d、42m 4s 等 设置 max 变量以显示尽可能多的标识符。

function secondsToString (seconds) 

var years = Math.floor(seconds / 31536000);
var max =2;
var current = 0;
var str = "";
if (years && current<max) 
    str+= years + 'y ';
    current++;

var days = Math.floor((seconds %= 31536000) / 86400);
if (days && current<max) 
    str+= days + 'd ';
    current++;

var hours = Math.floor((seconds %= 86400) / 3600);
if (hours && current<max) 
    str+= hours + 'h ';
    current++;

var minutes = Math.floor((seconds %= 3600) / 60);
if (minutes && current<max) 
    str+= minutes + 'm ';
    current++;

var seconds = seconds % 60;
if (seconds && current<max) 
    str+= seconds + 's ';
    current++;


return str;

【讨论】:

【参考方案12】:

这是我的看法。

请随意在jsbin 中使用它。

// This returns a string representation for a time interval given in milliseconds
// that appeals to human intuition and so does not care for leap-years,
// month length irregularities and other pesky nuisances.
const human_millis = function (ms, digits=1) 
    const levels=[
      ["ms", 1000],
      ["sec", 60],
      ["min", 60],
      ["hrs", 24],
      ["days", 7],
      ["weeks", (30/7)], // Months are intuitively around 30 days
      ["months", 12.1666666666666666], // Compensate for bakari-da in last step
      ["years", 10],
      ["decades", 10],
      ["centuries", 10],
      ["millenia", 10],
    ];
    var value=ms;
    var name="";
    var step=1;
    for(var i=0, max=levels.length;i<max;++i)
        value/=step;
        name=levels[i][0];
        step=levels[i][1];
        if(value < step)
            break;
        
    
    return value.toFixed(digits)+" "+name;


console.clear();
console.log("---------");
console.log(human_millis(1));
console.log(human_millis(10));
console.log(human_millis(100));
console.log(human_millis(1000));
console.log(human_millis(1000*60));
console.log(human_millis(1000*60*60));
console.log(human_millis(1000*60*60*24));
console.log(human_millis(1000*60*60*24*7));
console.log(human_millis(1000*60*60*24*30));
console.log(human_millis(1000*60*60*24*365));
console.log(human_millis(1000*60*60*24*365*10));
console.log(human_millis(1000*60*60*24*365*10*10));
console.log(human_millis(1000*60*60*24*365*10*10*10));
console.log(human_millis(1000*60*60*24*365*10*10*10*10));

如果您使用 Typescript 类型并进行强制转换以使其工作

let name : string | number = "";
    let step : string | number =1;
    for(var i=0, max=levels.length;i<max;++i)
        value/= step as number;
        name=levels[i][0];
        step=levels[i][1];
        if(value < step)
            break;
        
        
    

输出:

"---------"
"1.0 ms"
"10.0 ms"
"100.0 ms"
"1.0 sec"
"1.0 min"
"1.0 hrs"
"1.0 days"
"1.0 weeks"
"1.0 months"
"1.0 years"
"1.0 decades"
"1.0 centuries"
"1.0 millenia"
"10.0 millenia"

【讨论】:

【参考方案13】:

除了无数的方法之外,这里还有一种廉价而快捷的方法,只需一个时间单位即可检索人类可读的时间。

const timeScalars = [1000, 60, 60, 24, 7, 52];
const timeUnits = ['ms', 'secs', 'mins', 'hrs', 'days', 'weeks', 'years'];

const getHumanReadableTime = (ms, dp = 0) => 
  let timeScalarIndex = 0, scaledTime = ms;

  while (scaledTime > timeScalars[timeScalarIndex]) 
    scaledTime /= timeScalars[timeScalarIndex++];
  

  return `$scaledTime.toFixed(dp) $timeUnits[timeScalarIndex]`;
;

示例输出:

getHumanReadableTime(512000);
getHumanReadableTime(5120000);
getHumanReadableTime(51200000);
getHumanReadableTime(51200000, 2);
getHumanReadableTime(51200000, 6);

/*

Output:
    '9 min'
    '1 hrs'
    '14 hrs'
    '14.22 hrs'
    '14.222222 hrs'

*/

【讨论】:

【参考方案14】:

仅显示您需要的内容,而不是第 0 天、第 0 小时...

formatTime = function(time) 
        var ret = time % 1000 + ' ms';
        time = Math.floor(time / 1000);
        if (time !== 0) 
            ret = time % 60 + "s "+ret;
            time = Math.floor(time / 60);
            if (time !== 0) 
                ret = time % 60 + "min "+ret;
                time = Math.floor(time / 60);
                if (time !== 0) 
                    ret = time % 60 + "h "+ret;
                     ...
                
                       
        
        return ret;
    ;

【讨论】:

我喜欢它。它仅返回使用的部分(大于零)。顺便提一句。您在“ms”之前冷删除空间会导致其他单位在它们之前没有空间。【参考方案15】:

在 Dan 回答的帮助下,如果您想计算帖子创建时间(从 DB 中检索为 UTC)和用户系统时间之间的差异,然后向他们显示经过的时间,我想出了这个,你可以使用下面的函数

function dateToStr(input_date) 
  input_date= input_date+" UTC";
  // convert times in milliseconds
  var input_time_in_ms = new Date(input_date).getTime();
  var current_time_in_ms = new Date().getTime();
  var elapsed_time = current_time_in_ms - input_time_in_ms;

  function numberEnding (number) 
      return (number > 1) ? 's' : '';
  

  var temp = Math.floor(elapsed_time / 1000);
  var years = Math.floor(temp / 31536000);
  if (years) 
      return years + ' year' + numberEnding(years);
  
  //TODO: Months! Maybe weeks? 
  var days = Math.floor((temp %= 31536000) / 86400);
  if (days) 
      return days + ' day' + numberEnding(days);
  
  var hours = Math.floor((temp %= 86400) / 3600);
  if (hours) 
      return hours + ' hour' + numberEnding(hours);
  
  var minutes = Math.floor((temp %= 3600) / 60);
  if (minutes) 
      return minutes + ' minute' + numberEnding(minutes);
  
  var seconds = temp % 60;
  if (seconds) 
      return seconds + ' second' + numberEnding(seconds);
  
  return 'less than a second'; //'just now' //or other string you like;

例如:用法

var str = dateToStr('2014-10-05 15:22:16');

【讨论】:

【参考方案16】:

有 Intl.RelativeTimeFormat API,最新版本的 Chrome 和 Firefox 支持该 API。

几个例子:

let rtf = new Intl.RelativeTimeFormat("en");
rtf.format(-1, "day"); // 'yesterday'
rtf.format(-2, 'day'); // '2 days ago'
rtf.format(13.37, 'second'); // 'in 13.37 seconds'

this blog post 和 the proposal itself 中还有更多内容。

【讨论】:

这是时间戳,不是时间间隔。 “将时间间隔...转换成更易读的形式”听起来像是一个时间间隔【参考方案17】:

这是一个解决方案。稍后您可以通过“:”拆分并获取数组的值

 /**
 * Converts milliseconds to human readeable language separated by ":"
 * Example: 190980000 --> 2:05:3 --> 2days 5hours 3min
 */
function dhm(t)
    var cd = 24 * 60 * 60 * 1000,
        ch = 60 * 60 * 1000,
        d = Math.floor(t / cd),
        h = '0' + Math.floor( (t - d * cd) / ch),
        m = '0' + Math.round( (t - d * cd - h * ch) / 60000);
    return [d, h.substr(-2), m.substr(-2)].join(':');


//Example
var delay = 190980000;                   
var fullTime = dhm(delay);
console.log(fullTime);

【讨论】:

【参考方案18】:

我是对象的忠实粉丝,所以我从 https://metacpan.org/pod/Time::Seconds 创建了这个

用法:

var human_readable = new TimeSeconds(986543).pretty(); // 11 days, 10 hours, 2 minutes, 23 seconds

;(function(w) 
  var interval = 
    second: 1,
    minute: 60,
    hour: 3600,
    day: 86400,
    week: 604800,
    month: 2629744, // year / 12
    year: 31556930 // 365.24225 days
  ;

  var TimeSeconds = function(seconds)  this.val = seconds; ;

  TimeSeconds.prototype.seconds = function()  return parseInt(this.val); ;
  TimeSeconds.prototype.minutes = function()  return parseInt(this.val / interval.minute); ;
  TimeSeconds.prototype.hours = function()  return parseInt(this.val / interval.hour); ;
  TimeSeconds.prototype.days = function()  return parseInt(this.val / interval.day); ;
  TimeSeconds.prototype.weeks = function()  return parseInt(this.val / interval.week); ;
  TimeSeconds.prototype.months = function()  return parseInt(this.val / interval.month); ;
  TimeSeconds.prototype.years = function()  return parseInt(this.val / interval.year); ;

  TimeSeconds.prototype.pretty = function(chunks) 
    var val = this.val;
    var str = [];

    if(!chunks) chunks = ['day', 'hour', 'minute', 'second'];

    while(chunks.length) 
      var i = chunks.shift();
      var x = parseInt(val / interval[i]);
      if(!x && chunks.length) continue;
      val -= interval[i] * x;
      str.push(x + ' ' + (x == 1 ? i : i + 's'));
    

    return str.join(', ').replace(/^-/, 'minus ');
  ;

  w.TimeSeconds = TimeSeconds;
)(window);

【讨论】:

【参考方案19】:

我清理了其他答案之一,提供了不错的“10 秒前”样式字符串:

function msago (ms) 
    function suffix (number)  return ((number > 1) ? 's' : '') + ' ago'; 
    var temp = ms / 1000;
    var years = Math.floor(temp / 31536000);
    if (years) return years + ' year' + suffix(years);
    var days = Math.floor((temp %= 31536000) / 86400);
    if (days) return days + ' day' + suffix(days);
    var hours = Math.floor((temp %= 86400) / 3600);
    if (hours) return hours + ' hour' + suffix(hours);
    var minutes = Math.floor((temp %= 3600) / 60);
    if (minutes) return minutes + ' minute' + suffix(minutes);
    var seconds = Math.floor(temp % 60);
    if (seconds) return seconds + ' second' + suffix(seconds);
    return 'less then a second ago';
;

【讨论】:

【参考方案20】:
function java_seconds_to_readable(seconds)

    var numhours = Math.floor(seconds / 3600);
    var numminutes = Math.floor((seconds / 60) % 60);
    var numseconds = seconds % 60;
    return numhours + ":" + numminutes + ":" + numseconds;

更简单的方法。您可以分别选择年和日。

【讨论】:

【参考方案21】:

按照与@Dan 类似的方法,我修改了@Royi Namir 的代码以输出带有逗号和和的字符串:

secondsToString = function(seconds) 
    var numdays, numhours, nummilli, numminutes, numseconds, numyears, res;
    numyears = Math.floor(seconds / 31536000);
    numdays = Math.floor(seconds % 31536000 / 86400);
    numhours = Math.floor(seconds % 31536000 % 86400 / 3600);
    numminutes = Math.floor(seconds % 31536000 % 86400 % 3600 / 60);
    numseconds = seconds % 31536000 % 86400 % 3600 % 60;
    nummilli = seconds % 1.0;
    res = [];
    if (numyears > 0) 
        res.push(numyears + " years");
    
    if (numdays > 0) 
        res.push(numdays + " days");
    
    if (numhours > 0) 
        res.push(numhours + " hours");
    
    if (numminutes > 0) 
        res.push(numminutes + " minutes");
    
    if (numseconds > 0) 
        res.push(numseconds + " seconds");
    
    if (nummilli > 0) 
        res.push(nummilli + " milliseconds");
    
    return [res.slice(0, -1).join(", "), res.slice(-1)[0]].join(res.length > 1 ? " and " : "");
;

它没有句号,因此可以在其后添加句子,例如:

perform: function(msg, custom, conn) 
    var remTimeLoop;
    remTimeLoop = function(time) 
        if (time !== +custom[0]) 
            msg.reply((secondsToString(time)) + " remaining!");
        
        if (time > 15) 
            return setTimeout((function() 
                return remTimeLoop(time / 2);
            ), time / 2);
        
    ;
    // ...
    remTimeLoop(+custom[0]);

其中custom[0] 是等待的总时间;它将继续将时间除以 2,警告剩余时间直到计时器结束,并在时间低于 15 秒时停止警告。

【讨论】:

【参考方案22】:

以下适用于过去和未来的日期时间,也可以选择传递locale

function relativeTime(isoString, locale = "en") 
  const timestamp = Date.parse(isoString);
  const msPerMinute = 60 * 1000;
  const msPerHour = msPerMinute * 60;
  const msPerDay = msPerHour * 24;
  const msPerMonth = msPerDay * 30;
  const msPerYear = msPerDay * 365;

  const current = Date.now();
  let elapsed = current - timestamp;

  const sign = elapsed > 0 ? -1 : 1;

  elapsed = Math.abs(elapsed);

  const rtf = new Intl.RelativeTimeFormat(locale,  numeric: "auto" );

  if (elapsed < msPerMinute) 
    return rtf.format(sign * Math.floor(elapsed / 1000), "seconds");
   else if (elapsed < msPerHour) 
    return rtf.format(sign * Math.floor(elapsed / msPerMinute), "minutes");
   else if (elapsed < msPerDay) 
    return rtf.format(sign * Math.floor(elapsed / msPerHour), "hours");
   else if (elapsed < msPerMonth) 
    return rtf.format(sign * Math.floor(elapsed / msPerDay), "days");
   else if (elapsed < msPerYear) 
    return rtf.format(sign * Math.floor(elapsed / msPerMonth), "months");
   else 
    return new Date(timestamp).toLocaleString(locale);
  

输出:

relativeTime(new Date().toISOString()) //'2021-11-13T18:48:58.243Z'
-> now

relativeTime('2021-11-13T18:48:50.243Z')
-> 8 seconds ago

relativeTime('2021-11-14T18:48:50.243Z')
-> in 23 hours

relativeTime('2021-11-15T18:48:50.243Z')
-> tomorrow

relativeTime('2021-10-15T18:48:50.243Z')
-> 29 days ago

relativeTime('2021-12-15T18:48:50.243Z')
-> next month

【讨论】:

【参考方案23】:
function secondsToTimeString(input) 
  let years = 0, days = 0, hours = 0, minutes = 0, seconds = 0;
  let ref = [31536000,86400,3600,60,1];
  for (let i = 0;i < ref.length;i++) 
    let val = ref[i];
    while (val <= input) 
      input -= val;
      if (i === 0) years++;
      if (i === 1) days++;
      if (i === 2) hours++;
      if (i === 3) minutes++;      
      if (i === 4) seconds++;      
    
  return years, days, hours, minutes, seconds;
  

【讨论】:

以上是关于将以秒为单位的时间间隔转换为更易读的形式的主要内容,如果未能解决你的问题,请参考以下文章

从 Avro 将 unix 时间戳(以秒为单位)导入 Bigquery 中的正确时间戳

以秒为单位将时间间隔格式化为 X 小时(秒) Y 分钟(秒) Z 秒(秒)

c语言编写 输入一个以秒为单位的时间值,将其转化成“时:分:秒”的形式输出,怎么转换定义成函数?

以秒为单位的转换时间戳值不会反转为 python 中的原始时间戳

将 unix_timestamp 转换为 spark 中的普通时间戳(以秒为单位)

如何在 Swift3 中以秒为单位将字符串更改为分钟?