2014-12-05 34 views
6

我需要根據創建的日期將一堆項目分組到我的Web應用程序中。將時間戳倒到最近的日期

每個項目都有確切的時間戳,例如, 1417628530199。我使用Moment.js及其「time from now」功能將這些原始時間戳轉換爲可讀的日期,例如2 Days Ago。然後我想使用可讀日期作爲在同一日期創建的一組項目的標題。

問題是原始時間戳過於具體 - 在同一日期創建的兩個項目相隔一分鐘,每個項目都有唯一的時間戳記。所以,我得到2 Days Ago與第一項的標題下面,然後又報頭2 Days Ago與下面的第二個項目,等

什麼是四捨五入到最接近的日期的原始時間戳的最佳方式,因此,任何項目上創建同一日期將具有完全相同的時間戳,因此可以組合在一起?

回答

1

試試這個:

Date.prototype.formatDate = function() { 
    var yyyy = this.getFullYear().toString(); 
    var mm = (this.getMonth()+1).toString(); 
    var dd = this.getDate().toString(); 
    return yyyy + (mm[1]?mm:"0"+mm[0]) + (dd[1]?dd:"0"+dd[0]); 
    }; 

var utcSeconds = 1417903843000, 
    d = new Date(0); 

d.setUTCSeconds(Math.round(utcSeconds/1000.0)); 

var myTime = (function(){ 
     var theTime = moment(d.formatDate(), 'YYYYMMDD').startOf('day').fromNow(); 
     if(theTime.match('hours ago')){ 
      return 'Today'; 
     } 
     return theTime; 
    })(); 

alert(myTime); 

http://jsfiddle.net/cdn5rvck/4/

+0

這是非常接近我所尋找的...任何方式來獲得'fromNow()'只* *使用天作爲單位?例如,如果當前是下午3點,我創建了一個項目,即使我剛剛創建它,Moment也會將該日期顯示爲「15小時前」(因爲它基於距離上午12:00的距離)。我希望它只是說'今天'。 – daGUY 2014-12-05 22:41:55

+0

@daGuy我已經更新了代碼。這是否回答你的問題? – 2014-12-06 22:32:05

+0

工作,謝謝! – daGUY 2014-12-10 20:53:28

14

好,使用JS你可以這樣做:

var d = new Date(1417628530199); 
d.setHours(0); 
d.setMinutes(0); 
d.setSeconds(0); 
d.setMilliseconds(0); 

編輯:

檢查的幾種方法後,這一次似乎是速度快:

function roundDate(timeStamp){ 
    timeStamp -= timeStamp % (24 * 60 * 60 * 1000);//subtract amount of time since midnight 
    timeStamp += new Date().getTimezoneOffset() * 60 * 1000;//add on the timezone offset 
    return new Date(timeStamp); 
} 

您可以檢查速度差異如下:http://jsfiddle.net/juvian/3aqmhn2h/

+0

我覺得你更快速的方法不正確,因爲您使用時區在時間的當前時刻的偏移,而不是在時區偏移適用到給定的時間戳。您應該將第二次調整更改爲'timestamp.getTimezoneOffset()'。 – 2016-01-04 15:48:16

+0

@MichaelPetito timestamp是一個整數,所以你猜你的意思'新日期(時間戳).getTimezoneOffset()'?但是,timezoneOffset將與'new Date()'相同。 – juvian 2016-01-04 17:04:35

+0

時區偏移量可以變化,並且'getTimezoneOffset'獲取日期實例的偏移量。例如,我在美國東部時區,並且'new Date()。getTimezoneOffset()'在今天的日期爲'300',但'new Date(「6/1/2016」)'由於改變而爲'240'的夏令時。如果由時間戳記表示的日期與當前日期有不同的時區偏移,則您的代碼可能會產生意外的結果。例如。'roundDate(new Date(「6/1/2016」)。getTime())'日期結果'Wed Jun 01 2016 01:00:00 GMT-0400(東部夏令時)' - 不是午夜 - 對我來說今天。 – 2016-01-05 19:45:44

8

使用Moment.js,您可以使用下面的代碼一切四捨五入到一天的開始:

moment().startOf('day').toString(); 
// -> Prints out "Fri Dec 05 2014 00:00:00 GMT-0800" 

您可以在docs閱讀更多關於startOf()

+0

@Ken Fyrstenberg - 感謝編輯!由於某種原因,我在Ruby模式下考慮。我希望我能夠upvote編輯給你一些代表:-) – 2014-12-05 20:23:23

+0

不用擔心! +1爲好的解決方案:) – K3N 2014-12-05 20:52:12

0
function roundDownDate(date) { 
    if (typeof date !== "object" || !date.getUTCMilliseconds) { 
     throw Error("Arg must be a Date object."); 
    } 
    var offsetMs = date.getTimezoneOffset() * 60 * 1000, 
     oneDayMs = 24 * 60 * 60 * 1000; 
    return new Date(Math.floor((date.getTime() - offsetMs)/oneDayMs) * oneDayMs + offsetMs); 
}; 

這應該是非常快的。

0
function getDateOfTimeStamp(time) { 
    var originTime = 0; 
    var offsetOriginTime = originTime + new Date().getTimezoneOffset() * 60 * 1000; 
    var timeSinceOrigin = time - offsetOriginTime; 
    var timeModulo = timeSinceOrigin % (24 * 60 * 60 * 1000); 
    var normalizedTime = time - timeModulo; 

    console.log(new Date(normalizedTime) ,new Date(time)); 
    return normalizedTime; 
} 

這適用於我的項目。純數學,不需要字符串操作,不需要外部庫,所以速度非常快。

您可以通過複製上述功能的JavaScript控制檯嘗試,然後做normalizeTimeToDate(Date.now())