2012-03-25 187 views
3

我想使用JavaScript計算從我的生日以(年,月,日,小時,分鐘,秒)形式流逝的時間。使用javascript計算已用時間

例如,我的出生日期是1989年10月15日00時00分00秒。因此,從我的出生日期算起的時間是,

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

我想使用JavaScript代碼實現相同的輸出。在這種情況下,任何鏈接都會有幫助。

+0

需要兩個JavaScript Date對象:一個代表,代表你的出生日期爲當前日期和一個。然後你需要通過比較兩個對象來編寫代碼來構建該字符串。 – j4y 2012-03-25 14:18:00

+0

是的,我已經實現了我可以計算小時,分鐘和秒的部分。猜猜這是更容易的部分,因爲我努力計算日子和月份。 – 2012-03-25 14:42:08

回答

11

嘗試這樣:

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

MDN詢問。這會給你一些想法如何格式化結果。

+0

忘了提及...如果您不喜歡處理JS Date API,請查看http://momentjs.com/。該庫包含一些明智的默認操作。 – 2012-03-25 14:22:34

+0

這不適合我。我需要'var elapsedT = now - bDay'代替 – nishantjr 2016-02-08 05:03:05

+1

@nishantjr謝謝,調整。 – 2016-02-08 07:17:41

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 - birthYear)(currentMonth - birthMonth)
  2. 獲取在幾個月之差爲
  3. 重複所有單位
  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 2012-03-25 14:21:07

+0

我20歲1個月大。在這種情況下,一個月不是一個時間跨度,這是OP詢問的背景? 「我想計算自我生日以來的時間...」 – 2012-03-25 14:51:11

+0

如果今天是3月25日,那麼1個月前的日期是?是31天還是29天以前?我不知道。 – Kos 2012-03-25 19:34:52

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

你是對的!但我相信這就是挑戰! – 2012-03-25 14:44:36

+0

面臨的挑戰是以一種可以回答的方式制定您的問題。 :)對於「多長時間問題」(如果您是精確的話)的精確答案只能用國際單位制表示,或者以幾個小時或幾天(但不包括太陽日)的倍數表示。如果你在幾個月後,你只能說,從那以後有多少個月已經開始。當我說我23歲的時候,我只是說我已經打了很多次我的生日,我不是指一個精確的時間跨度。 – Kos 2012-03-25 19:44:29

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 

我相信這是正是 OP要求什麼。

+0

謝謝科林克...這正是我正在尋找的... – 2012-07-28 07:56:13

+0

感謝此代碼..這是一個好的開始。對於任何可能使用這個的人,我不得不顛倒減法的順序。此外,除非我的邏輯存在深夜瑕疵,否則我認爲有條件進位操作的順序也應該反轉(最先顯着的時間跨度)。最後,差異沒有被使用..不知道爲什麼在那裏。無論如何,偉大的貢獻! – snapfractalpop 2012-11-17 06:01:24

+0

我沒有爲我工作。我總是得到一些隨機值... – Moha 2013-02-19 17:24:11

2

使用Moment.js解析,驗證,操作和格式化Javascript中的日期。現在只有5.5k,所以你自己做這種低級代碼不是很好的理由。

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調用它,它會說經過的時間是1分10秒,而事實上這兩個時間戳之間的差異是:10秒。 – marni 2014-05-04 15:55:38

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

下面是一個簡單的方法來計算經過時間。出身日期,如今以毫秒爲單位

  • 通行證這種差異Date對象稱爲結果
  • 從Date對象的定義,請記住,結果對象是毫秒從01/01/1970 00:00之間

    1. 計算差異:00。
    2. 檢查此結果對象以獲取年,月等。

    這是要做的代碼。

    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/