2012-03-25 2 views
3

Я хочу рассчитать время, прошедшее с момента моего рождения, в виде (годы, месяцы, дни, часы, минуты, секунды) с использованием JavaScript.Вычислить время, прошедшее с помощью javascript

Например, моя дата рождения 15 октября 1989 года, 00 часов 00 мин. 00 сек. Следовательно, время, прошедшее с момента моего рождения, составляет

22 years 5 months 10 days 19 hours 25 minutes 25 seconds 

Я хочу получить тот же результат, используя код JavaScript. Любая ссылка или так, безусловно, поможет в этом случае.

+0

Вам нужно два Javascript Дата объекты: один, который представляет текущую дату и тот, который представляет дату рождения. Затем вам нужно написать код для создания этой строки путем сравнения двух объектов. – j4y

+0

Да, я реализовал ту часть, где я могу рассчитать часы, минуты и секунды. Угадайте, что это была более легкая часть, которая изо всех сил пыталась рассчитать дни и месяцы. –

ответ

11

попробовать что-то вроде этого:

var now = new Date(); 
var bDay = new Date(1989, 10, 15); 
var elapsedT = now - bDay; // in ms 

Read MDN для дальнейшей информации. Это даст вам представление о том, как отформатировать результат.

+0

Забыл упомянуть ... Если вам не нравится иметь дело с API JS Date, ознакомьтесь с http://momentjs.com/. Эта библиотека содержит некоторые разумные опционы по умолчанию. –

+0

Это не сработало для меня. Мне нужно было 'var elapsedT = now - bDay' вместо – nishantjr

+1

@nishantjr Спасибо, настроен. –

2

Посмотрите на JavaScript Date object. В частности, на этой странице, найдите раздел «Рассчитать Прошедшее время» (в нижней части):

// using static methods 
var start = Date.now(); 
// the event you'd like to time goes here: 
doSomethingForALongTime(); 
var end = Date.now(); 
var elapsed = end - start; // time in milliseconds 

В вашем случае start будет данная дата:

var start = new Date(1989,10,15); 
2

Если вы хотите для вычисления количества дней или даже недель вы можете сделать это, просто вычитая текущую временную метку из отметки времени вашего дня рождения и разделите ее на единицы времени компонента.

Однако, если вы хотите месяцев и лет, это немного сложнее из-за переменного количества дней в месяц.

Возможно, самый простой способ это сделать следующим образом:

  1. Получить разницу в годах (CURRENTYEAR - год рождения)
  2. Получить разницу в месяцах (currentMonth - birthMonth)
  3. Repeat для все блоки
  4. Если какой-либо блок отрицательный, вычтите 1 из приведенного выше устройства и добавьте, однако, многие из текущего блока составляют большую единицу.

Усложнение возникает, когда вы хотите узнать, сколько дней в этом месяце. Это может помочь:

function getDaysInMonth(month,year) { 
    if(typeof year == "undefined") year = 1999; // any non-leap-year works as default 
    var currmon = new Date(year,month), 
     nextmon = new Date(year,month+1); // no need to check for December overflow - JS does this automatically 
    return Math.floor((nextmon.getTime()-currmon.getTime())/24*3600); 
} 

Этого должно быть достаточно, чтобы вы попали на правильный путь. Дайте мне знать, если вам нужна дополнительная помощь.

+0

Я думаю, что это немного вводит в заблуждение. Нет такой вещи, как «разница в месяцах». Месяц не является периодом времени. – Kos

+0

Мне 20 лет и один месяц. Как в этом месяце не существует промежутка времени, о котором спрашивается ОП? «Я хочу рассчитать время, прошедшее с момента моего рождения ...» –

+0

Если сегодня 25 марта, какая дата была 1 месяц назад? Было ли это 31 день или 29 дней назад? Понятия не имею. – Kos

6

Прежде всего, то, что вы требуете, немного неточно. Мы знаем, что минута = 60 секунд, час = 60 минут ... И здесь останавливается. День может быть как 24, так и чуть больше 24 часов, в зависимости от того, как вы лечите високосные годы, а «один месяц» даже не пытается точно определить временной интервал.

Следовательно: либо сохраняйте свои временные рамки как часы, либо устанавливайте приближение к високосным годам и т. Д. Разница в датах и ​​датах (разницы) - это разные понятия и их нужно всегда обрабатывать по-разному.

Во всяком случае, как и для кода, я бы просто пойти:

var ms = new Date() - yourBirthDate; 
var secs = ms/1000; 

var minutes = secs /60 ; secs = secs % 60; 
var hours = minutes/60 ; minutes = minutes % 60; 
// and so on if you want 
+0

Вы правы! но я считаю, что это задача! –

+0

Задача состоит в том, чтобы сформулировать вашу проблему таким образом, на который можно ответить. :) Точный ответ на вопрос о том, «длинный вопрос» (если вы после точности), может быть выражен только в единицах времени СИ или их кратность, например, часы или дни (но не солнечные дни). Если вы после нескольких месяцев, вы можете сказать только то, сколько месяцев началось с тех пор. Когда я говорю, что мне 23 года, то я имею в виду только то, что я ударил свой день рождения так много раз, я не имею в виду точный промежуток времени. – Kos

8

Поскольку мой предыдущий ответ есть люди, пропавшие точку полностью, вот порт PHP код, который я должен сделать то же самое:

function getDaysInMonth(month,year) {  
    if(typeof year == "undefined") year = 1999; // any non-leap-year works as default  
    var currmon = new Date(year,month),  
     nextmon = new Date(year,month+1); 
    return Math.floor((nextmon.getTime()-currmon.getTime())/(24*3600*1000)); 
} 
function getDateTimeSince(target) { // target should be a Date object 
    var now = new Date(), diff, yd, md, dd, hd, nd, sd, out = []; 
    diff = Math.floor(now.getTime()-target.getTime()/1000); 
    yd = target.getFullYear()-now.getFullYear(); 
    md = target.getMonth()-now.getMonth(); 
    dd = target.getDate()-now.getDate(); 
    hd = target.getHours()-now.getHours(); 
    nd = target.getMinutes()-now.getMinutes(); 
    sd = target.getSeconds()-now.getSeconds(); 
    if(md < 0) {yd--; md += 12;} 
    if(dd < 0) { 
     md--; 
     dd += getDaysInMonth(now.getMonth()-1,now.getFullYear()); 
    } 
    if(hd < 0) {dd--; hd += 24;} 
    if(md < 0) {hd--; md += 60;} 
    if(sd < 0) {md--; sd += 60;} 

    if(yd > 0) out.push(yd+" year"+(yd == 1 ? "" : "s")); 
    if(md > 0) out.push(md+" month"+(md == 1 ? "" : "s")); 
    if(dd > 0) out.push(dd+" day"+(dd == 1 ? "" : "s")); 
    if(hd > 0) out.push(hd+" hour"+(hd == 1 ? "" : "s")); 
    if(nd > 0) out.push(nd+" minute"+(nd == 1 ? "" : "s")); 
    if(sd > 0) out.push(sd+" second"+(sd == 1 ? "" : "s")); 
    return out.join(" "); 
} 

Пример:

getDateTimeSince(new Date(1992,1,6,22,30,00)); 
// my date of birth - near enough half past ten in the evening on Feb 6th 1992 
> 20 years 1 month 18 days 17 hours 23 minutes 7 seconds 

Я считаю, что это именно, о чем просил ОП.

+0

Спасибо Kolink ... это именно то, что я искал ... –

+0

Спасибо за этот код .. это хорошее начало. Для всех, кто может это использовать, мне пришлось отменить порядок вычитаний. Кроме того, если у моей логики нет ночных недостатков, я думаю, что порядок условных операций переноса также должен быть отменен (с наименьшими значительными промежутками времени). Наконец, diff не использовался вообще. Не знаю, почему это все. Во всяком случае, большой вклад! – snapfractalpop

+0

Id не работал для меня. Я всегда получал некоторые случайные значения ... – Moha

2

Использование Moment.js для синтаксического анализа, проверки, управления и форматирования дат в Javascript. Только 5,5 тыс., Поэтому не так уж и много повод сделать этот низкоуровневый код в наши дни.

http://momentjs.com/

1
function getDaysInMonth(month,year) {  
    if(typeof year == "undefined") year = 1999; // any non-leap-year works as default  
    var currmon = new Date(year,month),  
     nextmon = new Date(year,month+1); 
    return Math.floor((nextmon.getTime()-currmon.getTime())/(24*3600*1000)); 
} 
function getDateTimeSince(target) { // target should be a Date object 
    var now = new Date(), yd, md, dd, hd, nd, sd, out = []; 

    yd = now.getFullYear()-target.getFullYear(); 
    md = now.getMonth()-target.getMonth(); 
    dd = now.getDate()-target.getDate(); 
    hd = now.getHours()-target.getHours(); 
    nd = now.getMinutes()-target.getMinutes(); 
    sd = now.getSeconds()-target.getSeconds(); 

    if(md < 0) {yd--; md += 12;} 
    if(dd < 0) { 
     md--; 
     dd += getDaysInMonth(now.getMonth()-1,now.getFullYear()); 
    } 
    if(hd < 0) {dd--; hd += 24;} 
    if(nd < 0) {hd--; nd += 60;} 
    if(sd < 0) {nd--; sd += 60;} 

    if(yd > 0) out.push(yd+" year"+(yd == 1 ? "" : "s")); 
    if(md > 0) out.push(md+" month"+(md == 1 ? "" : "s")); 
    if(dd > 0) out.push(dd+" day"+(dd == 1 ? "" : "s")); 
    if(hd > 0) out.push(hd+" hour"+(hd == 1 ? "" : "s")); 
    if(nd > 0) out.push(nd+" minute"+(nd == 1 ? "" : "s")); 
    if(sd > 0) out.push(sd+" second"+(sd == 1 ? "" : "s")); 
    return out.join(" "); 
} 

Это другая версия кодекса Kolink в. Были несколько ошибок в его что остановил этот скрипт работает правильно ...

+0

Предупреждение: этот код продолжает прерываться - он не обрабатывает минутную границу для вторых вычислений, а часовую границу для минутных расчетов и так далее. Например, скажем, что сейчас 11:31:05 (11:31 и 5 секунд), и мы называем это 11:30:55, он скажет, что прошедшее время составляет 1min 10 секунд, тогда как на самом деле разница между этими двумя метками времени составляет: 10 секунд. – marni

0

Мне нравится этот один:

function lifeSpan(t0) {var x=new Date()-t0, a=x, i=0,s=0,m=0,h=0,j=0; 
    if(a>=1){i=a%1000;a=(a-i)/1000; 
    if(a>=1){s=a%60;a=(a-s)/60; 
    if(a>=1){m=a%60;a=(a-m)/60; 
    if(a>=1){h=a%24;a=(a-h)/24; 
    if(a>=1){j=a;//... 
    }}}}} 
    return 'Elapsed: '+i+'ms '+s+'s '+m+'mn '+h+'h '+j+'j (or '+x+'ms).';} 
1

Вот простой способ вычислить истекшее время.

  1. разница между значениями даты происхождения и сегодня в миллисекундах
  2. Pass это различие объекта Date называется результат
  3. Помните из определения объекта Date, что этот результат объект миллисекунды от 01/01/1970 00:00 : 00.
  4. Осмотрите этот объект результата, чтобы получить годы, месяцы и т. Д.

Вот код для этого.

Date.prototype.getElapsedTime = function() { 
    var diffDate = new Date(Date.now() - this); 
    return "Elapsed Time: Years: " + (diffDate.getFullYear() - 1970) + ", Months: " + diffDate.getMonth() + ", Days: " + (diffDate.getDate() - 1) + ", Hours: " + diffDate.getHours() + ", Minutes: " + diffDate.getMinutes() + ", Seconds: " + diffDate.getSeconds(); 
}; 

var from = new Date("01/08/1986 04:07:00"); 
document.getElementById("result").innerHTML = from.getElapsedTime(); 

Вот то, что вы можете играть с: https://jsfiddle.net/nishchal/u8gt2gwq/4/

Смежные вопросы