一般社団法人 全国個人事業主支援協会

COLUMN コラム

こんにちは、7月から案件が変わり、残業多め、スケジュール管理がずさんな会社にあたってしまい、

テンションダダ下がりな根本です。

 

いつもはIT関連の気になった記事を紹介していますが、

今回は現在の案件の対応で少しはまってしまった話を自分の備忘+同じ人がいる場合の共有として書こうと思います。

 

今回対応した内容はDB:Aから取得したデータをDB:Bへ登録するというものです。

文章にしてしまうと簡単なのですが、

なぜ私がはまってしまったのかというと、

JSON.stringify()で日付項目を変換する際にタイムゾーンがUTCになってしまっていたため、
insertした時の時刻にずれが出てしまっていた問題でした。

既存コードでJSON形式にしてリクエストで取得結果を投げる方法で記載がされており、

JSON.stringify()の記述は変更できないため、どのようにしたらタイムゾーンが変換されずに、

取得した結果をinsertできるのか。

 

めちゃくちゃ調べました。

おそらく、スキルのある方はすぐに方法が思いつくのかもしれませんが、

たいしてスキルのない私はだいぶはまりました。。。

 

【検索ワード】

JSON.stringify

JSON.stringify 日付

タイムゾーン

nodejs 日付

などなど、、、、

 

私の環境がnodejsでの開発だったので、nodejsでの実装をどうすればよいのか、

本当に彷徨いました。

・replacerを使う

・以下の記述を使う

Date.prototype.toJSON=function(){return this.getFullYear()++(0+(this.getMonth()+1)).slice(2)++(0+this.getDate()).slice(2)+T+(0+this.getHours()).slice(2)+:+(0+this.getMinutes()).slice(2)+:+(0+this.getSeconds()).slice(2)+.000Z;}

 

いろいろ試しましたがうまくいかず、調べた結果、

JSON.stringify()で変換される前にDate型の値を文字列にするということが共通点だと気づきました。

そこで、YYYY/MM/DD hh:mm:ss.fff形式(私の案件ではミリ秒まで必要でした)の文字列に変換してからJSON.stringify()の処理に入ることでついに解決されました。

以下のソースでJSON.stringify()に渡す値を文字列に変換し、リクエストを投げてinsert。

ソース

function formatTimestampMilli(date) {
  let str = this.formatDate(date, ‘/’);
  if (!str) return ”;
  str += ‘ ‘;
  str += (‘0’ + (date.getHours())).slice(-2);
  str += ‘:’;
  str += (‘0’ + (date.getMinutes())).slice(-2);
  str += ‘:’;
  str += (‘0’ + (date.getSeconds())).slice(-2);
  str += ‘.’;
  str += (’00’ + (date.getMilliseconds())).slice(-3);
  return str;
}
少し考えたらなんて簡単なことだったのだろうと思いましたが、
一度はまってしまうとなかなか抜け出せないもので、
今回はよい学びとなりました。
このソースが同じようにはまっている方たちの役に立つことがあれば嬉しいです。
The following two tabs change content below.

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア