Cách định dạng thời gian kể từ xxx, ví dụ: 4 phút trước, tương tự như các trang web Stack Exchange


209

Câu hỏi đặt ra là làm thế nào để định dạng JavaScript Datedưới dạng một chuỗi cho biết thời gian đã trôi qua tương tự như cách bạn thấy thời gian được hiển thị trên Stack Overflow.

ví dụ

  • 1 phút trước
  • 1 giờ trước
  • 1 ngày trước
  • 1 tháng trước
  • 1 năm trước



Câu trả lời:


322

function timeSince(date) {

  var seconds = Math.floor((new Date() - date) / 1000);

  var interval = Math.floor(seconds / 31536000);

  if (interval > 1) {
    return interval + " years";
  }
  interval = Math.floor(seconds / 2592000);
  if (interval > 1) {
    return interval + " months";
  }
  interval = Math.floor(seconds / 86400);
  if (interval > 1) {
    return interval + " days";
  }
  interval = Math.floor(seconds / 3600);
  if (interval > 1) {
    return interval + " hours";
  }
  interval = Math.floor(seconds / 60);
  if (interval > 1) {
    return interval + " minutes";
  }
  return Math.floor(seconds) + " seconds";
}
var aDay = 24*60*60*1000;
console.log(timeSince(new Date(Date.now()-aDay)));
console.log(timeSince(new Date(Date.now()-aDay*2)));


3
@hello - yeah, một điểm thoát duy nhất có những ưu điểm khi nó không cản trở. những người quá coi trọng những ngày này đang hiểu sai về nguồn gốc của câu châm ngôn.
Sky Sanders

36
Chức năng tốt, nhưng một số nhận xét. Đã thay đổi dòng đầu tiên thành: var giây = Math.floor (((ngày mới (). GetTime () / 1000) - ngày)) để hoạt động với dấu thời gian unix. Và cần phải thay đổi intval> 1 thành intval> = 1 nếu không nó sẽ hiển thị những thứ như 75 phút (trong khoảng từ 1 đến 2 giờ).
Panman

3
@PanMan nếu bạn chỉ thay đổi> thành> = thì bạn sẽ kết thúc với thời gian như "1 phút". Tôi đã đăng một phiên bản sửa đổi của câu trả lời này có điều kiện thêm "s": stackoverflow.com/a/23259289/373655
cướp

Không bao giờ sử dụng nối chuỗi, nhưng String.format nếu bạn muốn một giải pháp có thể được quốc tế hóa
rds

Nếu tôi muốn đặt nó trong lớp div thì sao? Tôi có thể làm gì? Xin lỗi tôi không phải là một pro trong javascript. Tôi đã thử tài liệu này.getElementsByTagName ('. Sampleclass') [0] .innerHTML = timeSince (ngày); và tài liệu này.getEuityById ('idname') [0] .innerHTML = timeSince (ngày); nhưng nó không hoạt động. Có ai giúp đỡ không? Cảm ơn bạn.
x'tian

118

Có thể là một sự quá mức trong trường hợp này, nhưng nếu cơ hội cho thấy khoảnh khắc thật tuyệt vời!

Moment.js là một thư viện datetime javascript, để sử dụng nó cho kịch bản như vậy, bạn sẽ làm:

moment(yourdate).fromNow()

http://momentjs.com/docs/#/displaying/fromnow/

Phụ lục 2018 : Luxon là một thư viện hiện đại mới và có thể đáng xem!


Xin chào, tôi đang sử dụng câu trả lời của bạn để nhận thời gian differene. Tôi có thể làm gì nếu tôi chỉ cần các chữ cái đầu tiên của năm cơ sở dữ liệu là y, tháng và m và ngày là d?
Nodirabegimxonoyim

57

Tôi chưa kiểm tra (mặc dù sẽ không khó), nhưng tôi nghĩ rằng các trang web Stack Exchange sử dụng jquery.timeagoplugin để tạo các chuỗi thời gian này .


Nó khá dễ sử dụng plugin, và nó sạch sẽ và cập nhật tự động.

Đây là một mẫu nhanh (từ trang chủ của plugin):

Đầu tiên, tải jQuery và plugin:

<script src="jquery.min.js" type="text/javascript"></script> <script src="jquery.timeago.js" type="text/javascript"></script>

Bây giờ, hãy gắn nó vào dấu thời gian của bạn trên DOM đã sẵn sàng:

jQuery(document).ready(function() {
jQuery("abbr.timeago").timeago(); });

Điều này sẽ biến tất cả các abbryếu tố với một lớp timeagovà dấu thời gian ISO 8601 trong tiêu đề: <abbr class="timeago" title="2008-07-17T09:24:17Z">July 17, 2008</abbr>thành một cái gì đó như thế này: <abbr class="timeago" title="July 17, 2008">about a year ago</abbr>mang lại: khoảng một năm trước. Thời gian trôi qua, dấu thời gian sẽ tự động cập nhật.


11
Không phải ai cũng sử dụng JQuery.

2
Làm cho không có ý nghĩa để có điều này như là một plugin jquery.
AlexG

57

Điều này sẽ hiển thị cho bạn các định dạng thời gian trong quá khứ và trước đây như '2 ngày trước' 10 phút kể từ bây giờ 'và bạn có thể chuyển nó thành đối tượng Ngày, dấu thời gian số hoặc chuỗi ngày

function time_ago(time) {

  switch (typeof time) {
    case 'number':
      break;
    case 'string':
      time = +new Date(time);
      break;
    case 'object':
      if (time.constructor === Date) time = time.getTime();
      break;
    default:
      time = +new Date();
  }
  var time_formats = [
    [60, 'seconds', 1], // 60
    [120, '1 minute ago', '1 minute from now'], // 60*2
    [3600, 'minutes', 60], // 60*60, 60
    [7200, '1 hour ago', '1 hour from now'], // 60*60*2
    [86400, 'hours', 3600], // 60*60*24, 60*60
    [172800, 'Yesterday', 'Tomorrow'], // 60*60*24*2
    [604800, 'days', 86400], // 60*60*24*7, 60*60*24
    [1209600, 'Last week', 'Next week'], // 60*60*24*7*4*2
    [2419200, 'weeks', 604800], // 60*60*24*7*4, 60*60*24*7
    [4838400, 'Last month', 'Next month'], // 60*60*24*7*4*2
    [29030400, 'months', 2419200], // 60*60*24*7*4*12, 60*60*24*7*4
    [58060800, 'Last year', 'Next year'], // 60*60*24*7*4*12*2
    [2903040000, 'years', 29030400], // 60*60*24*7*4*12*100, 60*60*24*7*4*12
    [5806080000, 'Last century', 'Next century'], // 60*60*24*7*4*12*100*2
    [58060800000, 'centuries', 2903040000] // 60*60*24*7*4*12*100*20, 60*60*24*7*4*12*100
  ];
  var seconds = (+new Date() - time) / 1000,
    token = 'ago',
    list_choice = 1;

  if (seconds == 0) {
    return 'Just now'
  }
  if (seconds < 0) {
    seconds = Math.abs(seconds);
    token = 'from now';
    list_choice = 2;
  }
  var i = 0,
    format;
  while (format = time_formats[i++])
    if (seconds < format[0]) {
      if (typeof format[2] == 'string')
        return format[list_choice];
      else
        return Math.floor(seconds / format[2]) + ' ' + format[1] + ' ' + token;
    }
  return time;
}

var aDay = 24 * 60 * 60 * 1000;
console.log(time_ago(new Date(Date.now() - aDay)));
console.log(time_ago(new Date(Date.now() - aDay * 2)));


Thay thế dòng cuối cùng return time;với format = time_formats[time_formats.length - 1]; return Math.floor(seconds / format[2]) + ' ' + format[1] + ' ' + token;đến thế kỷ trở lại cho nhịp thời gian lớn thay vì mili giây.
Aquila Sands

Rất đẹp! Mặc dù tôi nhận thấy trong iOS, khi được sử dụng với bộ lọc góc cạnh, trình duyệt trả về NaN tại đây. Điều này sửa nó: time = + Ngày mới (time.replace (/ - / g, '/'));
Tiago

Tuyệt vời, nhưng sự phân công trong vòng lặp while đó thật xấu xí và khó hiểu. Thay đổi thành vòng lặp forEach sẽ tốt hơn
Martin Dawson

25

Dưới đây là một sửa đổi nhỏ trên giải pháp của Sky Sander, cho phép ngày được nhập dưới dạng chuỗi và có khả năng hiển thị các nhịp như "1 phút" thay vì "73 giây"

var timeSince = function(date) {
  if (typeof date !== 'object') {
    date = new Date(date);
  }

  var seconds = Math.floor((new Date() - date) / 1000);
  var intervalType;

  var interval = Math.floor(seconds / 31536000);
  if (interval >= 1) {
    intervalType = 'year';
  } else {
    interval = Math.floor(seconds / 2592000);
    if (interval >= 1) {
      intervalType = 'month';
    } else {
      interval = Math.floor(seconds / 86400);
      if (interval >= 1) {
        intervalType = 'day';
      } else {
        interval = Math.floor(seconds / 3600);
        if (interval >= 1) {
          intervalType = "hour";
        } else {
          interval = Math.floor(seconds / 60);
          if (interval >= 1) {
            intervalType = "minute";
          } else {
            interval = seconds;
            intervalType = "second";
          }
        }
      }
    }
  }

  if (interval > 1 || interval === 0) {
    intervalType += 's';
  }

  return interval + ' ' + intervalType;
};
var aDay = 24 * 60 * 60 * 1000;
console.log(timeSince(new Date(Date.now() - aDay)));
console.log(timeSince(new Date(Date.now() - aDay * 2)));


2
Điều này không hoạt động trong vài giây vì khoảng thời gian còn lại là 0 từ interval = Math.floor(seconds / 60);. Tôi đã thêm interval = seconds;vào trận chung kết elsevà nó hoạt động tốt.
howard10 ngày

2
Nếu khoảng là 0, bạn cũng nên thêm "s".
JW.

Điều này thật tuyệt. Đối với TS, tôi đã phải thêm một nhà điều hành đơn phương vàolet seconds = Math.floor((+new Date() - date) / 1000);
Ben Racicot

Tại sao bạn kiểm tra thậm chí cho interval === 0cuối cùng if?
smartmouse

1
@smartmouse để nó sẽ nói "0 giây" thay vì "0 giây"
cướp

14

Bạn có thể muốn xem humanized_time_span: https://github.com/layam/js_humanized_time_span

Đó là thuyết bất khả tri và hoàn toàn tùy biến.

Chỉ cần tải xuống / bao gồm tập lệnh và sau đó bạn có thể làm điều này:

humanized_time_span("2011-05-11 12:00:00")  
   => '3 hours ago'

humanized_time_span("2011-05-11 12:00:00", "2011-05-11 16:00:00)  
   => '4 hours ago'

hoặc thậm chí này:

var custom_date_formats = {
  past: [
    { ceiling: 60, text: "less than a minute ago" },
    { ceiling: 86400, text: "$hours hours, $minutes minutes and $seconds seconds ago" },
    { ceiling: null, text: "$years years ago" }
  ],
  future: [
    { ceiling: 60, text: "in less than a minute" },
    { ceiling: 86400, text: "in $hours hours, $minutes minutes and $seconds seconds time" },
    { ceiling: null, text: "in $years years" }
  ]
}

humanized_time_span("2010/09/10 10:00:00", "2010/09/10 10:00:05", custom_date_formats) 
  => "less than a minute ago"

Đọc tài liệu để biết thêm.


4
Chỉ có nghĩa là nó không dựa vào jQuery hoặc thậm chí có DOM.
Will Tomlins

Nó cho tôi NaN years agotại sao ??

chết tiệt, tôi hiểu rồi ... ví dụ về việc sử dụng nó là sai. bạn thực sự phân định các số đầu tiên bằng dấu gạch chéo thay vì "-" .. như thế nàyhumanized_time_span("2011/05/11 12:00:00")

nó có thể phụ thuộc vào văn hóa địa phương của bạn và sự khác biệt giữa những người dùng :)
mikus

13

Đã thay đổi chức năng trên thành

function timeSince(date) {

    var seconds = Math.floor(((new Date().getTime()/1000) - date)),
    interval = Math.floor(seconds / 31536000);

    if (interval > 1) return interval + "y";

    interval = Math.floor(seconds / 2592000);
    if (interval > 1) return interval + "m";

    interval = Math.floor(seconds / 86400);
    if (interval >= 1) return interval + "d";

    interval = Math.floor(seconds / 3600);
    if (interval >= 1) return interval + "h";

    interval = Math.floor(seconds / 60);
    if (interval > 1) return interval + "m ";

    return Math.floor(seconds) + "s";
}

Nếu không, nó sẽ hiển thị những thứ như "75 phút" (từ 1 đến 2 giờ). Bây giờ nó cũng giả sử ngày đầu vào là dấu thời gian Unix.


Hãy chia ngày cho 1000.

Tôi đã sử dụng điều này khi dữ liệu đến từ cơ sở dữ liệu với dấu thời gian Unix trong vài giây. Khi tính bằng mili giây, bạn cần chia cho 1000.
Panman

11

Mã tương thích nhiều trình duyệt và dễ đọc:

Được đưa ra bởi @Travis

var DURATION_IN_SECONDS = {
  epochs: ['year', 'month', 'day', 'hour', 'minute'],
  year: 31536000,
  month: 2592000,
  day: 86400,
  hour: 3600,
  minute: 60
};

function getDuration(seconds) {
  var epoch, interval;

  for (var i = 0; i < DURATION_IN_SECONDS.epochs.length; i++) {
    epoch = DURATION_IN_SECONDS.epochs[i];
    interval = Math.floor(seconds / DURATION_IN_SECONDS[epoch]);
    if (interval >= 1) {
      return {
        interval: interval,
        epoch: epoch
      };
    }
  }

};

function timeSince(date) {
  var seconds = Math.floor((new Date() - new Date(date)) / 1000);
  var duration = getDuration(seconds);
  var suffix = (duration.interval > 1 || duration.interval === 0) ? 's' : '';
  return duration.interval + ' ' + duration.epoch + suffix;
};

alert(timeSince('2015-09-17T18:53:23'));


Lưu ý rằng điều này đưa ra một số giả định sai, chẳng hạn như mỗi ngày là 86.400 giây (trừ khi múi giờ được đặt thành UTC, điều này không phải lúc nào cũng đúng nhờ UTC)
ItalyPaleAle

10

Một phiên bản ngắn hơn được sử dụng bởi Lokely :

const intervals = [
  { label: 'year', seconds: 31536000 },
  { label: 'month', seconds: 2592000 },
  { label: 'day', seconds: 86400 },
  { label: 'hour', seconds: 3600 },
  { label: 'minute', seconds: 60 },
  { label: 'second', seconds: 0 }
];

function timeSince(date) {
  const seconds = Math.floor((Date.now() - date.getTime()) / 1000);
  const interval = intervals.find(i => i.seconds < seconds);
  const count = Math.floor(seconds / interval.seconds);
  return `${count} ${interval.label}${count !== 1 ? 's' : ''} ago`;
}

2
Khoảng thời gian ngắn nhất có thời lượng 0 giây - điều này dẫn đến việc chia cho sai số bằng không.
apk

@apk nói đúng. <60 giây nó được inInfinity seconds ago
leo lên

8

từ bây giờ, unix dấu thời gian param,

function timeSince(ts){
    now = new Date();
    ts = new Date(ts*1000);
    var delta = now.getTime() - ts.getTime();

    delta = delta/1000; //us to s

    var ps, pm, ph, pd, min, hou, sec, days;

    if(delta<=59){
        ps = (delta>1) ? "s": "";
        return delta+" second"+ps
    }

    if(delta>=60 && delta<=3599){
        min = Math.floor(delta/60);
        sec = delta-(min*60);
        pm = (min>1) ? "s": "";
        ps = (sec>1) ? "s": "";
        return min+" minute"+pm+" "+sec+" second"+ps;
    }

    if(delta>=3600 && delta<=86399){
        hou = Math.floor(delta/3600);
        min = Math.floor((delta-(hou*3600))/60);
        ph = (hou>1) ? "s": "";
        pm = (min>1) ? "s": "";
        return hou+" hour"+ph+" "+min+" minute"+pm;
    } 

    if(delta>=86400){
        days = Math.floor(delta/86400);
        hou =  Math.floor((delta-(days*86400))/60/60);
        pd = (days>1) ? "s": "";
        ph = (hou>1) ? "s": "";
        return days+" day"+pd+" "+hou+" hour"+ph;
    }

}

5

Phiên bản ES6 của mã được cung cấp bởi @ user1012181

// Epochs
const epochs = [
    ['year', 31536000],
    ['month', 2592000],
    ['day', 86400],
    ['hour', 3600],
    ['minute', 60],
    ['second', 1]
];


// Get duration
const getDuration = (timeAgoInSeconds) => {
    for (let [name, seconds] of epochs) {
        const interval = Math.floor(timeAgoInSeconds / seconds);

        if (interval >= 1) {
            return {
                interval: interval,
                epoch: name
            };
        }
    }
};


// Calculate
const timeAgo = (date) => {
    const timeAgoInSeconds = Math.floor((new Date() - new Date(date)) / 1000);
    const {interval, epoch} = getDuration(timeAgoInSeconds);
    const suffix = interval === 1 ? '' : 's';

    return `${interval} ${epoch}${suffix} ago`;
};

Được chỉnh sửa với các đề xuất @ ibe-vanmeenen. (Cảm ơn !)


Bạn cũng nên bao gồm "thứ hai: 1" trong EPOCHS, nếu không nó sẽ bị hỏng nếu cách đây chưa đến 1 phút :). 3 vars cuối cùng cũng có thể là một hằng số không?
Ibe Vanmeenen

1
Ngoài ra, EPOCHS phải là một mảng, vì các đối tượng không đảm bảo thứ tự các thuộc tính. Tôi đã lưu trữ các thay đổi của mình trong gist.github.com/IbeVanmeenen/4e3e58820c9168806e57530563612886 . Bạn có thể sao chép chúng để chỉnh sửa câu trả lời này :)
Ibe Vanmeenen

5

Phiên bản đơn giản và dễ đọc:

const NOW = new Date()
const times = [["second", 1], ["minute", 60], ["hour", 3600], ["day", 86400], ["week", 604800], ["month", 2592000], ["year", 31536000]]

function timeAgo(date) {
    var diff = Math.round((NOW - date) / 1000)
    for (var t = 0; t < times.length; t++) {
        if (diff < times[t][1]) {
            if (t == 0) {
                return "Just now"
            } else {
                diff = Math.round(diff / times[t - 1][1])
                return diff + " " + times[t - 1][0] + (diff == 1?" ago":"s ago")
            }
        }
    }
}

3

Tôi viết một cái với js và python, được sử dụng trong hai dự án, rất hay và đơn giản: một thư viện đơn giản (ít hơn 2kb) được sử dụng để định dạng ngày bằng *** time agocâu lệnh.

đơn giản, nhỏ, dễ sử dụng, và được thử nghiệm tốt.

  1. npm install timeago.js

  2. import timeago from 'timeago.js'; // or use script tag

  3. sử dụng api format.

Mẫu vật:

var timeagoIns  = timeago();
timeagoIns .format('2016-06-12');

Ngoài ra, bạn có thể kết xuất trong thời gian thực.

var timeagoIns = timeago();
timeagoIns.render(document.querySelectorAll('time'));

Kể từ 4.0, bạn có thể sử dụng nhập khẩu bị hủy thay thế:import { format, render, cancel, register } from 'timeago.js';

3

Mặc dù câu hỏi đã được hỏi cách đây khá lâu, nhưng viết câu trả lời này với hy vọng nó sẽ giúp được ai đó.

Vượt qua ngày bạn muốn bắt đầu đếm từ. Sử dụng moment().fromNow()các momentjs : (Xem thêm thông tin tại đây )

getRelativeTime(date) {
    const d = new Date(date * 1000);
    return moment(d).fromNow();
}

Nếu bạn muốn thay đổi thông tin được cung cấp cho các ngày từ Bây giờ, bạn hãy viết thời gian tương đối tùy chỉnh của mình trong giây lát.

Ví dụ: trong trường hợp của riêng tôi, tôi muốn in 'one month ago'thay vì 'a month ago'( được cung cấp bởi khoảnh khắc (d) .fromNow () ). Trong trường hợp này, bạn có thể viết một cái gì đó được đưa ra dưới đây.

moment.updateLocale('en', {
    relativeTime: {
        future: 'in %s',
        past: '%s ago',
        s: 'a few seconds',
        ss: '%d seconds',
        m: '1 m',
        mm: '%d minutes',
        h: '1 h',
        hh: '%d hours',
        d: '1 d',
        dd: '%d days',
        M: '1 month',
        MM: '%d months',
        y: '1 y',
        yy: '%d years'
    }
});

LƯU Ý : Tôi đã viết mã cho dự án trong Agular 6


3

Cũng có thể sử dụng dayjs relativeTime plugin để giải quyết việc này.

import * as dayjs from 'dayjs';
import * as relativeTime from 'dayjs/plugin/relativeTime';

dayjs.extend(relativeTime);
dayjs(dayjs('1990')).fromNow(); // x years ago

3

Điều này sẽ xử lý đúng mọi dấu thời gian hợp lệ, bao gồm Date.now (), các đơn vị số ít và ngày trong tương lai. Tôi đã bỏ đi hàng tháng, nhưng những thứ đó sẽ dễ dàng để thêm vào. Tôi đã cố gắng để nó dễ đọc nhất có thể.

function getTimeInterval(date) {
  let seconds = Math.floor((Date.now() - date) / 1000);
  let unit = "second";
  let direction = "ago";
  if (seconds < 0) {
    seconds = -seconds;
    direction = "from now";
  }
  let value = seconds;
  if (seconds >= 31536000) {
    value = Math.floor(seconds / 31536000);
    unit = "year";
  } else if (seconds >= 86400) {
    value = Math.floor(seconds / 86400);
    unit = "day";
  } else if (seconds >= 3600) {
    value = Math.floor(seconds / 3600);
    unit = "hour";
  } else if (seconds >= 60) {
    value = Math.floor(seconds / 60);
    unit = "minute";
  }
  if (value != 1)
    unit = unit + "s";
  return value + " " + unit + " " + direction;
}

console.log(getTimeInterval(Date.now())); // 0 seconds ago
console.log(getTimeInterval(Date.now() + 1000)); // 1 second from now
console.log(getTimeInterval(Date.now() - 1000)); // 1 second ago
console.log(getTimeInterval(Date.now() + 60000)); // 1 minute from now
console.log(getTimeInterval(Date.now() - 120000)); // 2 minutes ago
console.log(getTimeInterval(Date.now() + 120000)); // 2 minutes from now
console.log(getTimeInterval(Date.now() + 3600000)); // 1 hour from now
console.log(getTimeInterval(Date.now() + 360000000000)); // 11 years from now
console.log(getTimeInterval(0)); // 49 years ago


2

Tôi đã sửa đổi phiên bản Sky Sanders. Các hoạt động Math.floor (...) được đánh giá trong khối if

       var timeSince = function(date) {
            var seconds = Math.floor((new Date() - date) / 1000);
            var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
            if (seconds < 5){
                return "just now";
            }else if (seconds < 60){
                return seconds + " seconds ago";
            }
            else if (seconds < 3600) {
                minutes = Math.floor(seconds/60)
                if(minutes > 1)
                    return minutes + " minutes ago";
                else
                    return "1 minute ago";
            }
            else if (seconds < 86400) {
                hours = Math.floor(seconds/3600)
                if(hours > 1)
                    return hours + " hours ago";
                else
                    return "1 hour ago";
            }
            //2 days and no more
            else if (seconds < 172800) {
                days = Math.floor(seconds/86400)
                if(days > 1)
                    return days + " days ago";
                else
                    return "1 day ago";
            }
            else{

                //return new Date(time).toLocaleDateString();
                return date.getDate().toString() + " " + months[date.getMonth()] + ", " + date.getFullYear();
            }
        }

nếu có một lỗi đánh máy cuối cùng nếu return days + "1 day ago";nên làreturn "1 day ago";
Marco Gurnari

2
function dateToHowManyAgo(stringDate){
    var currDate = new Date();
    var diffMs=currDate.getTime() - new Date(stringDate).getTime();
    var sec=diffMs/1000;
    if(sec<60)
        return parseInt(sec)+' second'+(parseInt(sec)>1?'s':'')+' ago';
    var min=sec/60;
    if(min<60)
        return parseInt(min)+' minute'+(parseInt(min)>1?'s':'')+' ago';
    var h=min/60;
    if(h<24)
        return parseInt(h)+' hour'+(parseInt(h)>1?'s':'')+' ago';
    var d=h/24;
    if(d<30)
        return parseInt(d)+' day'+(parseInt(d)>1?'s':'')+' ago';
    var m=d/30;
    if(m<12)
        return parseInt(m)+' month'+(parseInt(m)>1?'s':'')+' ago';
    var y=m/12;
    return parseInt(y)+' year'+(parseInt(y)>1?'s':'')+' ago';
}
console.log(dateToHowManyAgo('2019-11-07 19:17:06'));

1
function timeago(date) {
    var seconds = Math.floor((new Date() - date) / 1000);
    if(Math.round(seconds/(60*60*24*365.25)) >= 2) return Math.round(seconds/(60*60*24*365.25)) + " years ago";
    else if(Math.round(seconds/(60*60*24*365.25)) >= 1) return "1 year ago";
    else if(Math.round(seconds/(60*60*24*30.4)) >= 2) return Math.round(seconds/(60*60*24*30.4)) + " months ago";
    else if(Math.round(seconds/(60*60*24*30.4)) >= 1) return "1 month ago";
    else if(Math.round(seconds/(60*60*24*7)) >= 2) return Math.round(seconds/(60*60*24*7)) + " weeks ago";
    else if(Math.round(seconds/(60*60*24*7)) >= 1) return "1 week ago";
    else if(Math.round(seconds/(60*60*24)) >= 2) return Math.round(seconds/(60*60*24)) + " days ago";
    else if(Math.round(seconds/(60*60*24)) >= 1) return "1 day ago";
    else if(Math.round(seconds/(60*60)) >= 2) return Math.round(seconds/(60*60)) + " hours ago";
    else if(Math.round(seconds/(60*60)) >= 1) return "1 hour ago";
    else if(Math.round(seconds/60) >= 2) return Math.round(seconds/60) + " minutes ago";
    else if(Math.round(seconds/60) >= 1) return "1 minute ago";
    else if(seconds >= 2)return seconds + " seconds ago";
    else return seconds + "1 second ago";
}

1

Giải pháp của tôi..

(function(global){
            const SECOND   = 1;
            const MINUTE   = 60;
            const HOUR     = 3600;
            const DAY      = 86400;
            const MONTH    = 2629746;
            const YEAR     = 31556952;
            const DECADE   = 315569520;

            global.timeAgo = function(date){
                var now = new Date();
                var diff = Math.round(( now - date ) / 1000);

                var unit = '';
                var num = 0;
                var plural = false;

                switch(true){
                    case diff <= 0:
                        return 'just now';
                    break;

                    case diff < MINUTE:
                        num = Math.round(diff / SECOND);
                        unit = 'sec';
                        plural = num > 1;
                    break;

                    case diff < HOUR:
                        num = Math.round(diff / MINUTE);
                        unit = 'min';
                        plural = num > 1;
                    break;

                    case diff < DAY:
                        num = Math.round(diff / HOUR);
                        unit = 'hour';
                        plural = num > 1;
                    break;

                    case diff < MONTH:
                        num = Math.round(diff / DAY);
                        unit = 'day';
                        plural = num > 1;
                    break;

                    case diff < YEAR:
                        num = Math.round(diff / MONTH);
                        unit = 'month';
                        plural = num > 1;
                    break;

                    case diff < DECADE:
                        num = Math.round(diff / YEAR);
                        unit = 'year';
                        plural = num > 1;
                    break;

                    default:
                        num = Math.round(diff / YEAR);
                        unit = 'year';
                        plural = num > 1;
                }

                var str = '';
                if(num){
                    str += `${num} `;
                }

                str += `${unit}`;

                if(plural){
                    str += 's';
                }

                str += ' ago';

                return str;
            }
        })(window);

        console.log(timeAgo(new Date()));
        console.log(timeAgo(new Date('Jun 03 2018 15:12:19 GMT+0300 (FLE Daylight Time)')));
        console.log(timeAgo(new Date('Jun 03 2018 13:12:19 GMT+0300 (FLE Daylight Time)')));
        console.log(timeAgo(new Date('May 28 2018 13:12:19 GMT+0300 (FLE Daylight Time)')));
        console.log(timeAgo(new Date('May 28 2017 13:12:19 GMT+0300 (FLE Daylight Time)')));
        console.log(timeAgo(new Date('May 28 2000 13:12:19 GMT+0300 (FLE Daylight Time)')));
        console.log(timeAgo(new Date('Sep 10 1994 13:12:19 GMT+0300 (FLE Daylight Time)')));

1

Cú đâm của tôi vào điều này dựa trên các câu trả lời khác.

function timeSince(date) {
    let minute = 60;
    let hour   = minute * 60;
    let day    = hour   * 24;
    let month  = day    * 30;
    let year   = day    * 365;

    let suffix = ' ago';

    let elapsed = Math.floor((Date.now() - date) / 1000);

    if (elapsed < minute) {
        return 'just now';
    }

    // get an array in the form of [number, string]
    let a = elapsed < hour  && [Math.floor(elapsed / minute), 'minute'] ||
            elapsed < day   && [Math.floor(elapsed / hour), 'hour']     ||
            elapsed < month && [Math.floor(elapsed / day), 'day']       ||
            elapsed < year  && [Math.floor(elapsed / month), 'month']   ||
            [Math.floor(elapsed / year), 'year'];

    // pluralise and append suffix
    return a[0] + ' ' + a[1] + (a[0] === 1 ? '' : 's') + suffix;
}

0

Tôi đang tìm kiếm một câu trả lời cho vấn đề này và gần như đã thực hiện một trong những giải pháp này, nhưng một đồng nghiệp đã nhắc nhở tôi kiểm tra react-intlthư viện vì chúng tôi đã sử dụng nó.

Vì vậy, thêm vào các giải pháp ... trong trường hợp bạn đang sử dụng react-intlthư viện, họ có một <FormattedRelative>thành phần cho việc này.

https://github.com/yahoo/react-intl/wiki/Components#formattedrelative


0

Đây là những gì tôi đã làm (đối tượng trả về đơn vị thời gian cùng với giá trị của nó):

function timeSince(post_date, reference)
{
	var reference = reference ? new Date(reference) : new Date(),
		diff = reference - new Date(post_date + ' GMT-0000'),
		date = new Date(diff),
		object = { unit: null, value: null };
	
	if (diff < 86400000)
	{
		var secs  = date.getSeconds(),
			mins  = date.getMinutes(),
			hours = date.getHours(),
			array = [ ['second', secs], ['minute', mins], ['hour', hours] ];
	}
	else
	{
		var days   = date.getDate(),
			weeks  = Math.floor(days / 7),
			months = date.getMonth(),
			years  = date.getFullYear() - 1970,
			array  = [ ['day', days], ['week', weeks], ['month', months], ['year', years] ];
	}

	for (var i = 0; i < array.length; i++)
	{
		array[i][0] += array[i][1] != 1 ? 's' : '';

		object.unit  = array[i][1] >= 1 ? array[i][0] : object.unit;
		object.value = array[i][1] >= 1 ? array[i][1] : object.value;
	}

	return object;
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.