2

日時文字列 (2015-05-12 13:30:00+00") と時刻文字列 ("7:00 AM") の値を持つ 2 つのプロパティを持つオブジェクトを Sails API に渡しています。 .

私の Sails コントローラーでは、日時文字列から元の時刻を削除し、時刻文字列を 24 時間形式に変換し、UTC 日付オブジェクトを作成して PostgreSQL データベースに挿入します。コントローラーのコードは次のとおりです。

module.exports = {
   toDateObj: function(req, res) {
      if (!req.param('jobSchedObj')) {
        res.badRequest('Missing required parameter!');
      } else {
        var date = req.param('jobSchedObj').scheduled_date;
        var startTime = req.param('jobSchedObj').scheduled_start_time;
        var endTime = req.param('jobSchedObj').scheduled_end_time;
        var times = {scheduled_start_time: startTime, scheduled_end_time: endTime};
        var toInsert = [];
        var toInsertObj = {};
        for (var time in times) {
        //Strip time from date
        var dateRegex = /(\d{4})-(\d{2})-(\d{2})/g;
        var thisDate = dateRegex.exec(date);

        //format new time to 24-hour format
        var hours = Number(times[time].match(/^(\d+)/)[1]);
        var minutes = Number(times[time].match(/:(\d+)/)[1]);
        var AP = times[time].match(/\s(.*)$/);
        if (!AP) {
          AP = times[time].slice(-2);
        } else {
          AP = AP[1]
        }
        if (AP == "PM" && hours < 12) {
          hours = hours + 12
        }
        if (AP == "AM" && hours == 12) {
          hours = hours - 12
        }
        var Hours24 = hours.toString();
        var Minutes24 = minutes.toString();
        if (hours < 10) {
          Hours24 = "0" + Hours24
        }
        if (minutes < 10) {
          Minutes24 = "0" + Minutes24
        }

        //Concat new 24-hour time with date and create Date Obj   
        toInsertObj[time] = new Date(Date.UTC(parseInt(thisDate[1]), 
          parseInt(thisDate[2]) - 1, 
          parseInt(thisDate[3]), 
          parseInt(Hours24), 
          parseInt(Minutes24)));

    }
        toInsertObj.allotted_time = req.param('jobSchedObj').allotted_time;
        toInsertObj.repair_shop_equipment_id = req.param('jobSchedObj').repair_shop_equipment_id;
        toInsertObj.technician_id = req.param('jobSchedObj').technician_id;
        toInsertObj.repair_history_id = req.param('jobSchedObj').repair_history_id;
        toInsertObj.repair_shop_id = req.param('jobSchedObj').repair_shop_id;

        toInsert.push(toInsertObj);

        Schedules.create(toInsert, function (err, schedules){
          if (err) {
            res.send(err);
          } else {
            res.send(schedules);
          }
        }); 
      }
    }
 };

そして、これは、コントローラー ロジックが何を行っているかを確認するためにテストするCodePenです。

上部に元の例のようなものを入力すると、UTC"2015-05-12 13:30:00+00", "7:00 AM"が返されます。Tue May 12 2015 03:30:00 GMT-0400 (EDT)

しかし、pgAdminでテーブルを開くと、値として保存され2015-05-12 7:30:00+00、値を取得するためにgetリクエストを行うと、値が文字列として返されます"2015-05-12T7:30:00.000Z"

次に、その文字列を日付オブジェクトに戻すために何をしようとしても、日付値は最終的に2015-05-12 3:30 AM. Moment.jsのさまざまなメソッドと同様Date.parse(<string>)に、私は試しました。解析する前に戻り文字列の末尾をnew Date(<string>)切り取っても違いはありませんでした。000Z

私が返したいのは、投稿された時間の UTC/ローカルを表すエポック時間に変換できるものです。

4

1 に答える 1

2

Brad、sails-postgresql にはタイムゾーンの問題があります。balderdashy/sails-postgresql#153を確認してください。それに関連して、travis ci ビルドを変更して、sails-postgresql 標準テストをオランダのタイムゾーンで実行するようにしました。これにより、テストが中断されました。 L263 .

元の例のように「2015-05-12 13:30:00+00」、「7:00 AM」と入力すると、Tue May 12 2015 03:30:00 GMT-0400 (EDT) が返されます。は UTC です。

しかし、pgAdmin でテーブルを開くと、2015-05-12 7:30:00+00 として保存されます

Sails-postgresql (waterline-sequel 経由) は、日付を PostgreSQL に送信する前に UTC に変換します (関連するコード)。Sails-postgresql の動作の詳細については、このコメントを参照してください。

balderdashy/sails-postgresql#153には、ウォーターラインで日付を処理する方法と、それに合わせて Sails-postgresql を変更する方法を理解するためのより広範な議論があります。

于 2015-05-17T21:29:04.833 に答える