web-dev-qa-db-ja.com

タイムスタンプを最も近い日付に丸めます

Webアプリの多数のアイテムを作成日ごとにグループ化する必要があります。

各アイテムには正確なタイムスタンプがあります。 1417628530199Moment.js とその " 今からの時間 "機能を使用して、これらの生のタイムスタンプを読みやすい日付に変換しています。 2 Days Ago。次に、読み取り可能な日付を、同じ日付に作成されたアイテムのグループのヘッダーとして使用します。

問題は、生のタイムスタンプが具体的すぎることです。同じ日付で1分間隔で作成された2つのアイテムには、それぞれ一意のタイムスタンプがあります。したがって、最初の項目が下にある2 Days Agoのヘッダーを取得し、次に2番目の項目が下にある2 Days Agoの別のヘッダーを取得します。

生のタイムスタンプを最も近い日付に丸めて、同じ日付に作成されたアイテムがまったく同じタイムスタンプを持ち、グループ化できるようにするための最良の方法は何ですか?

12
daGUY

これを試して:

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/

1
Joe L.

さて、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/

24
juvian

Moment.jsを使用すると、次のコードを使用して、すべてを1日の始まりに丸めることができます。

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

startOf()の詳細については、 docs を参照してください。

10
Topher Fangio

年、月、日付のみを使用して、既存の日付から新しい日付を作成するだけです。半日を追加して、最も近い日付であることを確認します。

var offset = new Date(Date.now() +43200000);
var rounded = new Date(offset .getFullYear(),offset .getMonth(),offset .getDate());
console.log(new Date());
console.log(rounded);

これはフットプリントが小さいように見えるので、プロトタイプを拡張してDate「クラス」に含めることも役立ちます。

Date.prototype.round = function(){
    var dateObj = new Date(+this+43200000);
    return new Date(dateObj.getFullYear(), dateObj.getMonth(), dateObj.getDate());
};
console.log(new Date().round());

最小化:

Date.prototype.round = function(){var d = new Date(+this+43200000);return new Date(d.getFullYear(), d.getMonth(), d.getDate());};
4
Travis J
_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())を実行してみてください。

0
thomasttvo
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
norep