Stack Exchange sitelerine benzer şekilde, ör. Xxx'ten beri geçen zaman nasıl biçimlendirilir?


210

Soru, bir JavaScript'in Date, Yığın Taşması'nda görüntülenen sürelere benzer şekilde geçen süreyi belirten bir dize olarak nasıl biçimlendirileceği .

Örneğin

  • 1 dakika önce
  • 1 saat önce
  • 1 gün önce
  • 1 ay önce
  • 1 yıl önce



Yanıtlar:


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
@ merhaba - evet, tek çıkış noktası engel olmadığında erdemleri var. bu günlerde onu çok ciddiye alanlar, maxim'in kökenini yanlış anlıyorlar.
Sky Sanders

36
İyi işlev, ancak bazı açıklamalar. İlk satırı, unix zaman damgalarıyla çalışmak için var seconds = Math.floor (((new Date (). GetTime () / 1000) - date)) olarak değiştirdi. Ve intval> 1'i intval> = 1 olarak değiştirmek gerekir, aksi takdirde 75 dakika (1 ile 2 saat arasında) gibi şeyler gösterir.
PanMan

3
@PanMan>> = olarak değiştirirseniz "1 dakika" gibi zamanlar elde edersiniz. Bu yanıtın, koşullu olarak "s" ekleyen değiştirilmiş bir sürümünü yayınladım: stackoverflow.com/a/23259289/373655
rob

Asla dize birleştirme kullanmayın, ancak uluslararasılaştırılabilecek bir çözüm istiyorsanız String.format
rds

Div sınıfına yerleştirmek istersem ne olur? Ne yapabilirim? Üzgünüm javascript'te profesyonel değilim. Bu document.getElementsByTagName ('. Sampleclass') [0] .innerHTML = timeSince (tarih); ve bu document.getElementById ('idname') [0] .innerHTML = timeSince (tarih); ama işe yaramıyor. Herhangi bir yardım? Teşekkür ederim.
x'tian

119

Bu durumda aşırıya kaçabilir , ancak fırsat moment.js'yi gösteriyorsa harika!

Moment.js, böyle bir senaryo için kullanmak için bir javascript datetime kütüphanesidir:

moment(yourdate).fromNow()

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

2018 eki : Luxon yeni bir modern kütüphane ve bir göz atmaya değer olabilir!


Merhaba, cevabınızı zamanın farklı olması için kullanıyorum. Y, ay, m ve gün olarak sadece ilk datelike yıl harflerine ihtiyacım olursa ne yapabilirim?
Nodirabegimxonoyim

57

(Zor olmasa da) kontrol etmedim, ancak Stack Exchange sitelerinin bu zaman dizelerini oluşturmak için jquery.timeagoeklentiyi kullandığını düşünüyorum .


Eklentiyi kullanmak oldukça kolay ve temiz ve otomatik olarak güncelleniyor.

İşte hızlı bir örnek (eklentinin ana sayfasından):

İlk olarak, jQuery ve eklentiyi yükleyin:

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

Şimdi DOM'daki zaman damgalarınıza ekleyelim:

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

Bu , başlığında ISO abbrsınıfı timeagove ISO 8601 zaman damgası olan tüm öğeleri şu şekilde <abbr class="timeago" title="2008-07-17T09:24:17Z">July 17, 2008</abbr>dönüştürür: <abbr class="timeago" title="July 17, 2008">about a year ago</abbr>bu da yaklaşık bir yıl önce verir. Zaman geçtikçe zaman damgaları otomatik olarak güncellenir.


11
Herkes JQuery kullanmaz.

2
Bunu jquery eklentisi olarak almanın hiçbir anlamı yok.
AlexG

57

Bu size, '2 gün önce' '10 dakika sonra' gibi geçmiş ve önceki zaman biçimlerini gösterecek ve bir Date nesnesi, sayısal bir zaman damgası veya bir tarih dizesi iletebilirsiniz.

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


Son satırı değiştirin return time;ile format = time_formats[time_formats.length - 1]; return Math.floor(seconds / format[2]) + ' ' + format[1] + ' ' + token;yerine milisaniye büyük zaman süreçleri için dönüş yüzyıllar.
Aquila Sands

Çok hoş! İOS'ta fark etsem de, bir filtre olarak açısal ile kullanıldığında, tarayıcı NaN'yi buraya geri döndürüyor. Bu sorunu düzeltir: time = + yeni Tarih (time.replace (/ - / g, '/'));
Tiago

Harika, ama döngüdeki görev çirkin ve kafa karıştırıcı. Her forop döngüsüne geçmek daha iyi olurdu
Martin Dawson

25

İşte Sky Sander'in çözümü üzerinde tarihin bir dize olarak girilmesini sağlayan ve "73 saniye" yerine "1 dakika" gibi açıklıkları gösterebilen küçük bir değişiklik.

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
Aralık 0 olarak kaldığı için bu saniyeler boyunca çalışmaz interval = Math.floor(seconds / 60);. interval = seconds;Finale ekledim elseve iyi çalışıyor.
howard10

2
Aralık 0 ise, "s" harfini de eklemelisiniz.
JW.

Bu harika. TS için tek bir operatör eklemek zorunda kaldımlet seconds = Math.floor((+new Date() - date) / 1000);
Ben Racicot

interval === 0Sonunda neden kontrol ediyorsun if?
smartmouse

1
o "0 saniye" yerine "0 saniye" demek böylece @smartmouse
soymak

14

Humanized_time_span'a bakmak isteyebilirsiniz: https://github.com/layam/js_humanized_time_span

Çerçeve agnostik ve tamamen özelleştirilebilir.

Sadece betiği indir / dahil et ve sonra bunu yapabilirsin:

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'

hatta bu:

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"

Daha fazla bilgi için belgeleri okuyun.


4
Sadece jQuery'ye ve hatta bir DOM'ye sahip olmadığı anlamına gelir.
Tomlins

Bana NaN years agoneden veriyor ??

kahretsin anladım ... kullanım örneği yanlış. aslında ilk sayıları "-" yerine eğik çizgi ile humanized_time_span("2011/05/11 12:00:00")

Yerel kültürünüze bağlı olabilir ve kullanıcılar arasında farklılık gösterebilir :)
mikus

13

Yukarıdaki işlev şu şekilde değiştirildi:

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

Aksi takdirde "75 dakika" gibi şeyler gösterir (1 ile 2 saat arasında). Ayrıca artık giriş tarihinin bir Unix zaman damgası olduğunu varsayar.


Tarihi 1000'e bölün lütfen.

Bu veri saniyeler içinde Unix zaman damgaları ile bir veritabanından geldi burada kullanılır. Milisaniye cinsindeyken 1000'e bölmeniz gerekir.
PanMan

11

Çok okunabilir ve çapraz tarayıcı uyumlu kod:

@Travis tarafından verildiği gibi

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


Bunun her gün 86.400 saniye olması gibi bazı yanlış varsayımlar yaptığını unutmayın (saat dilimi UTC olarak ayarlanmadığı sürece, bu UTC sayesinde her zaman doğru değildir)
ItalyPaleAle

10

Lokely tarafından kullanılan daha kısa bir versiyon :

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
En kısa aralığın süresi sıfır saniyedir - bu, sıfır hata ile bölünmeye neden olur.
apk

@apk haklı. <60 saniye yazdırırInfinity seconds ago
leonheess

8

bundan sonra unix zaman damgası parametresi,

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

@ User1012181 tarafından sağlanan kodun ES6 sürümü

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

@ İbe-vanmeenen önerileriyle düzenlendi. (Teşekkürler !)


Ayrıca EPOCHS'e "second: 1" yazmalısınız, aksi takdirde 1 dakikadan daha kısa bir süre önce kırılır :). Son 3 vars da sabit olabilir?
Ibe Vanmeenen

1
Ayrıca, nesneler özellik sırasını garanti etmediği için EPOCHS bir dizi olmalıdır. Değişikliklerimi gist.github.com/IbeVanmeenen/4e3e58820c9168806e57530563612886 adresinde sakladım . Bu yanıtı düzenlemek için onları kopyalayabilirsiniz
Ibe Vanmeenen

5

Basit ve okunabilir versiyon:

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

Çok güzel ve basit, iki projede kullanılan js ve python ile bir yazmak: basit bir kütüphane (2kb daha az) tarih *** time agoifadesi ile biçimlendirmek için kullanılır .

basit, küçük, kolay kullanılan ve iyi test edilmiş.

  1. npm install timeago.js

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

  3. api kullanın format.

Örneklem:

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

Ayrıca gerçek zamanlı render yapabilirsiniz.

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

4.0 itibariyle bunun yerine import { format, render, cancel, register } from 'timeago.js';
yıkılmış

3

Soru oldukça uzun zaman önce sorulmuş olsa da, bu cevabı umutla yazmak birisine yardımcı olacaktır.

Saymaya başlamak istediğiniz tarihi iletin. Kullanımı moment().fromNow()ait momentjs : (Daha fazla bilgi bakınız burada )

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

Tarihler için sağlanan bilgileri şu andan itibaren değiştirmek istiyorsanızŞimdi özel göreli zamanınızı yazıyorsunuz.

Örneğin, kendi durumumda ( an (d) .fromNow () tarafından sağlanan)'one month ago' yerine yazdırmak istedim . Bu durumda, aşağıda verilen bir şeyi yazabilirsiniz.'a month ago'

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

NOT : Proje kodumu Agular 6'da yazdım


3

Bunu çözmek için dayjs relativeTime eklentisini de kullanabilirsiniz .

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

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

3

Bu, Date.now (), tekil birimler ve gelecekteki tarihler dahil olmak üzere geçerli tüm zaman damgalarını düzgün bir şekilde işlemelidir. Ayları dışarıda bıraktım, ancak bunların eklenmesi kolay olmalı. Mümkün olduğunca okunabilir tutmaya çalıştım.

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

Sky Sanders'in versiyonunu değiştirdim. Math.floor (...) işlemleri if bloğunda değerlendirilir

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

return days + "1 day ago";Olması gerekiyorsa başka bir yazım hatası varreturn "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

Çözümüm..

(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

Diğer cevaplara dayanarak bu sapmam.

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

İşte yaptım (nesne değeri ile birlikte zaman birimini döndürür):

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.