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
Sky Sanders
sumber
14
momentjs.com
atilkan
Berguna untuk ini: Intl.RelativeTimeFormat.prototype.format().
Константин Ван

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

Sky Sanders
sumber
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!

Fabiano Soriani
sumber
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.

Maxim Zaslavsky
sumber
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)));

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

rampok
sumber
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.

Will Tomlin
sumber
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.

PanMan
sumber
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'));

pengguna1012181
sumber
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`;
}
Sam
sumber
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;
    }

}
pkarc
sumber
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!)

Geoffroy Warin
sumber
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")
            }
        }
    }
}
jcrs
sumber
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'));
sebuah alat
sumber
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

Nodirabegimxonoyim
sumber
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
jjbskir
sumber
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

Akan
sumber
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();
            }
        }
Moses Koledoye
sumber
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'));
Boumeziane Marouane
sumber
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";
}
Uygar
sumber
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)')));
nikksan
sumber
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;
}
Maksim Ivanov
sumber
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

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

nateclonch
sumber