2016-10-06 32 views
2

私はデータベースとしてMongoDBを使用するReactアプリケーションを作成しています。特に特定の文書の日付を更新するときに、データベースから日付を保存したり取得したりするときに、奇妙な動作があるようです。MongoDBで異常な日付の動作

新しい文書を作成すると、すべて問題ありません。しかし、AJAX呼び出しを使用してその文書の日付を編集しようとすると、MongoDBに保存されている日付は、選択した日付より1日早く、ブラウザに表示される日付になります。もう少し説明するために、以下のコードを書いてください。

日付は、HTML5 <input type='date' />要素を使用して選択されます。ここにいくつかのコードがあります。コンソールログをさまざまな時点で表示して出力を表示しました。 2016年10月30日を日付として選択しているとします。

saveChanges(e, cancel){ 
     e.preventDefault(); 
     const cancelled = cancel ? true : false 

     console.log(this.state.date); // 30 Oct 
     console.log(this.state.year); // 2016 

     const saveData = { 
      id: this.props.data.id, 
      venue: this.state.venue, 
      unitNumber: this.state.unitNumber, 
      unitName: this.state.unitName, 
      date: this.state.date, 
      year: this.state.year, 
      day: this.state.day, 
      tutorID: this.state.tutorID, 
      cancelled: cancelled 
     } 

     editWorkshop(saveData, (data) => { 
      this.props.getWorkshopDetails(); 
      this.props.workshopDetailsSaved(data); 
     }); 

    } 

:日付と年が他の場所で表示目的のために別れたが、その後、サーバーに送信する前にJSのDateオブジェクトの形で一緒に参加します

が反応コンポーネントメソッドを(以下のコードを参照してください)上記の方法は editWorkshop.jsのデータ、外部のAJAX呼び出し、使用axios送信:AJAX呼び出しを処理

import axios from 'axios'; 

export default function editWorkshop(input, callback){ 

    const date = new Date(input.date + ' ' + input.year) // Rejoin date and year and convert to Date object 
    console.log(date); // Sun Oct 30 2016 00:00:00 GMT+0100 (BST) 
    const data = { 
     id: input.id, 
     venue: input.venue, 
     unitNumber: input.unitNumber, 
     unitName: input.unitName, 
     date: date, 
     day: input.day, 
     tutorID: input.tutorID, 
     cancelled: input.cancelled 
    } 

    axios.post('/editWorkshop', data).then(function(res){ 
     callback(res.data); 
     }) 
    } 

そして最後に明示的ルートを

本当に奇妙何210
const express = require('express'); 
const Workshop = require('../data/models/Workshop'); 

module.exports = function(req, res){ 

    const data = req.body 
    console.log(data.date); // 2016-10-29T23:00:00.000Z - here is where it seems to go wrong - notice that the date has changed to 2016-10-29 instead of 10-30. This now gets written to the database 
    Workshop.update({ _id: data.id }, { 
     $set: { 
      unitNumber: data.unitNumber, 
      date: data.date, 
      venue: data.venue, 
      tutor: data.tutorID, 
      session: data.day, 
      cancelled: data.cancelled 
     } 
    }, function(err){ 
     if (err) { 
      res.send(err); 
      return 
     } 
     var message = 'Workshop updated' 
     res.send({ 
      success: true, 
      message: message 
     }); 
    }) 

} 

は、私は別の場所のアプリケーションでデータベースからデータを取得するとき、それはブラウザで正しい日付を示すことである - 10月30日2016年

間違いなくこれは正しいような問題ではありません日付が表示されていますが、これらの日付はアプリの基本的な部分であり、今後のバグの範囲がある可能性があることを心配しています。

誰もがこれにどのような光を当てることができますか?

答えて

5

2016-10-29T23:00:00.000Zは、Sun Oct 30 2016 00:00:00 GMT+0100 (BST)と同じです。

2016-10-29T23:00:00.000Zは、UTC(GMT)タイムゾーンです。それをBSTに変換すると、同じ値が得られます。

MongoDBは、日付値をエポックからUTCミリ秒として保存します。 docsから

MongoDBは、デフォルトでUTCで時間を格納し、このフォームに任意のローカル 時間表現を変換します。または修正されていない現地時間値を報告する アプリケーションは、UTCタイムスタンプと一緒に時間帯 を保存して、アプリケーションのロジック で元の現地時間を計算することができます。

+1

これは素晴らしいことです。日付が正しく保存されていれば、私はこの不一致を乗り越えることができます。将来的に潜在的なバグがないことを確認したかっただけです。 – Chris

関連する問題