Cara memformat waktu sejak xxx misalnya "4 menit yang lalu" mirip dengan situs Stack Exchange


210

Pertanyaannya adalah bagaimana memformat JavaScript Datesebagai string yang menyatakan waktu yang berlalu mirip dengan cara Anda melihat waktu yang ditampilkan pada Stack Overflow.

misalnya

  • 1 menit yang lalu
  • 1 jam yang lalu
  • 1 hari yang lalu
  • 1 bulan lalu
  • 1 tahun yang lalu



Jawaban:


324

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
@ Halo - ya, satu titik keluar memiliki keutamaan ketika itu tidak menghalangi. mereka yang menganggapnya terlalu serius akhir-akhir ini salah paham tentang asal mula peribahasa.
Sky Sanders

36
Fungsinya bagus, tetapi beberapa komentar. Mengubah baris pertama menjadi: var seconds = Math.floor (((Tanggal baru (). GetTime () / 1000) - date)) untuk bekerja dengan cap waktu unix. Dan perlu mengubah intval> 1 ke intval> = 1 jika tidak maka akan menunjukkan hal-hal seperti 75 menit (antara 1 dan 2 jam).
PanMan

3
@ PanMan jika Anda hanya mengubah> ke> = maka Anda akan berakhir dengan waktu seperti "1 menit". Saya memposting versi modifikasi dari jawaban ini yang menambahkan "s" secara kondisional: stackoverflow.com/a/23259289/373655
rob

Jangan pernah menggunakan penggabungan string, tetapi String.format jika Anda menginginkan solusi yang dapat
diinternasionalkan

Bagaimana jika saya ingin menempatkannya di kelas div? Apa yang dapat saya? Maaf saya bukan pro dalam javascript. Saya mencoba dokumen ini.getElementsByTagName ('. Sampleclass') [0] .innerHTML = timeSince (date); dan dokumen ini.getElementById ('idname') [0] .innerHTML = timeSince (date); tapi itu tidak berhasil. Ada bantuan? Terima kasih.
x'tian

119

Mungkin berlebihan dalam hal ini, tetapi jika kesempatan menunjukkan moment.js hanya luar biasa!

Moment.js adalah pustaka datavascript javascript, untuk menggunakannya untuk skenario seperti itu, Anda harus:

moment(yourdate).fromNow()

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

Tambahan 2018 : Luxon adalah perpustakaan modern baru dan mungkin layak untuk dilihat!


Halo, saya menggunakan jawaban Anda untuk mendapatkan waktu yang berbeda. Apa yang dapat saya lakukan jika saya hanya perlu huruf pertama tahun seperti tahun, bulan dan bulan dan hari seperti d?
Nodirabegimxonoyim

57

Saya belum memeriksa (walaupun tidak sulit untuk), tapi saya pikir situs Stack Exchange menggunakan jquery.timeagoplugin untuk membuat string waktu ini .


Cukup mudah untuk menggunakan plugin, dan itu bersih dan diperbarui secara otomatis.

Berikut contoh cepat (dari beranda plugin):

Pertama, muat jQuery dan plugin:

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

Sekarang, mari kita lampirkan ke cap waktu Anda di DOM siap:

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

Ini akan mengubah semua abbrelemen dengan kelas timeagodan cap waktu ISO 8601 pada judul: <abbr class="timeago" title="2008-07-17T09:24:17Z">July 17, 2008</abbr>menjadi sesuatu seperti ini: <abbr class="timeago" title="July 17, 2008">about a year ago</abbr>yang menghasilkan: sekitar setahun yang lalu. Seiring waktu berlalu, cap waktu akan secara otomatis diperbarui.


11
Tidak semua orang menggunakan JQuery.

2
Tidak masuk akal untuk memiliki ini sebagai plugin jquery.
AlexG

57

Ini akan menunjukkan kepada Anda format waktu lampau dan sebelumnya seperti '2 hari yang lalu' '10 menit dari sekarang' dan Anda dapat meneruskannya baik objek Date, cap waktu numerik atau string tanggal

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)));


Ganti baris terakhir return time;dengan format = time_formats[time_formats.length - 1]; return Math.floor(seconds / format[2]) + ' ' + format[1] + ' ' + token;untuk mengembalikan berabad-abad untuk rentang waktu yang besar, bukan milidetik.
Aquila Sands

Sangat bagus! Meskipun saya perhatikan di iOS, ketika digunakan dengan sudut sebagai filter, browser mengembalikan NaN di sini. Ini memperbaikinya: time = + Date baru (time.replace (/ - / g, '/'));
Tiago

Hebat, tapi tugas di loop sementara itu jelek dan membingungkan. Mengganti forEach loop akan lebih baik
Martin Dawson

25

Berikut ini adalah sedikit modifikasi pada solusi Sky Sander yang memungkinkan tanggal untuk dimasukkan sebagai string dan mampu menampilkan rentang seperti "1 menit" dan bukannya "73 detik"

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
Ini tidak berfungsi selama detik karena interval dibiarkan 0 dari interval = Math.floor(seconds / 60);. Saya menambahkan interval = seconds;ke final elsedan berfungsi dengan baik.
howard10

2
Jika interval 0, Anda juga harus menambahkan "s".
JW.

Ini luar biasa. Untuk TS saya harus menambahkan operator unary padalet seconds = Math.floor((+new Date() - date) / 1000);
Ben Racicot

Mengapa Anda memeriksa bahkan interval === 0di yang terakhir if?
smartmouse

1
@smartmouse sehingga ia akan mengatakan "0 detik" bukannya "0 detik"
rob

14

Anda mungkin ingin melihat humanized_time_span: https://github.com/layam/js_humanized_time_span

Ini kerangka agnostik dan sepenuhnya dapat disesuaikan.

Cukup unduh / sertakan skrip lalu Anda dapat melakukan ini:

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'

atau bahkan ini:

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"

Baca dokumen untuk info lebih lanjut.


4
Hanya berarti bahwa itu tidak bergantung pada jQuery atau bahkan memiliki DOM.
Will Tomlins

Itu memberi saya NaN years agomengapa ??

Sial, saya mengerti ... contoh penggunaannya salah. Anda benar-benar membatasi angka pertama dengan garis miring alih-alih "-" ..seperti inihumanized_time_span("2011/05/11 12:00:00")

itu mungkin tergantung pada budaya lokal Anda dan berbeda antara pengguna :)
mikus

13

Mengubah fungsi di atas menjadi

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";
}

Kalau tidak, itu akan menunjukkan hal-hal seperti "75 menit" (antara 1 dan 2 jam). Itu juga sekarang mengasumsikan tanggal input adalah cap waktu Unix.


Tolong bagi tanggal dengan 1000.

Saya menggunakan ini di mana data berasal dari database dengan cap waktu Unix dalam hitungan detik. Ketika dalam milidetik Anda perlu membaginya dengan 1000.
PanMan

11

Banyak kode yang kompatibel dan dapat dibaca lintas peramban:

Seperti yang diberikan oleh @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'));


Perhatikan bahwa ini membuat beberapa asumsi yang salah, seperti setiap hari menjadi 86.400 detik (kecuali zona waktu ditetapkan ke UTC, ini tidak selalu benar berkat UTC)
ItalyPaleAle

10

Versi yang lebih pendek seperti yang digunakan oleh 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
Interval terpendek memiliki durasi nol detik - ini menghasilkan pembagian dengan kesalahan nol.
apk

@ Apk benar. <60 detik itu tercetakInfinity seconds ago
leonheess

8

dari sekarang, unix timestamp 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

Versi ES6 dari kode yang disediakan oleh @ 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`;
};

Diedit dengan saran @ ibe-vanmeenen. (Terima kasih!)


Anda juga harus memasukkan "second: 1" di EPOCHS, jika tidak maka akan rusak jika kurang dari 1 menit yang lalu :). 3 vars terakhir juga bisa berupa no konstan?
Ibe Vanmeenen

1
Selain itu, EPOCHS harus berupa array, karena objek tidak menjamin urutan properti. Saya telah menyimpan perubahan saya di gist.github.com/IbeVanmeenen/4e3e58820c9168806e57530563612886 . Anda dapat menyalinnya untuk mengedit jawaban ini :)
Ibe Vanmeenen

5

Versi sederhana dan mudah dibaca:

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

Saya menulis satu dengan js dan python, digunakan dalam dua proyek, sangat bagus dan sederhana: perpustakaan sederhana (kurang dari 2kb) digunakan untuk memformat tanggal dengan *** time agopernyataan.

sederhana, kecil, mudah digunakan, dan teruji dengan baik.

  1. npm install timeago.js

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

  3. gunakan api format.

Sampel:

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

Anda juga dapat membuat secara real-time.

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

Pada 4.0 Anda dapat menggunakan impor yang dirusak sebagai gantinya:import { format, render, cancel, register } from 'timeago.js';
cmfolio

3

Meskipun pertanyaannya sudah lama ditanyakan, menulis jawaban ini dengan harapan itu akan membantu seseorang.

Lewati tanggal Anda ingin mulai menghitung. Menggunakan moment().fromNow()dari momentjs : (Lihat informasi lebih lanjut di sini )

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

Jika Anda ingin mengubah informasi yang diberikan untuk tanggal dari Sekarang Anda menulis waktu relatif khusus Anda untuk saat ini.

Misalnya, dalam kasus saya sendiri saya ingin mencetak 'one month ago'alih-alih 'a month ago'( disediakan saat (d) .dari Sekarang () ). Dalam hal ini, Anda dapat menulis sesuatu yang diberikan di bawah ini.

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'
    }
});

CATATAN : Saya menulis kode untuk proyek di Agular 6


3

Dapat juga menggunakan plugin relativeTime dayjs untuk menyelesaikan ini.

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

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

3

Ini harus menangani stempel waktu yang valid dengan benar, termasuk Date.now (), unit tunggal, dan tanggal mendatang. Saya keluar berbulan-bulan, tetapi itu harus mudah ditambahkan. Saya mencoba membuatnya tetap bisa dibaca.

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

Saya telah memodifikasi versi Sky Sanders. Operasi Math.floor (...) dievaluasi di blok 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();
            }
        }

ada kesalahan ketik pada yang terakhir jika return days + "1 day ago";seharusnyareturn "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

Solusi saya ..

(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

Tusukan saya berdasarkan jawaban lain.

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

Saya mencari jawaban untuk ini dan hampir mengimplementasikan salah satu solusi ini, tetapi seorang rekan mengingatkan saya untuk memeriksa react-intlperpustakaan karena kami sudah menggunakannya.

Jadi menambahkan solusi ... jika Anda menggunakan react-intlperpustakaan, mereka memiliki <FormattedRelative>komponen untuk ini.

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


0

Inilah yang saya lakukan (objek mengembalikan satuan waktu beserta nilainya):

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;
}

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.