AWS Lambda PowertoolsはLambda関数使い必携の便利ユーティリティなわけだが、なぜかこれのloggerで自動的に記録されるタイムスタンプの形式が、2021-05-03 10:20:19, 650+0200
のようなよくわからん形になっている。カンマ……?(参考記事: AWS Lambda Powertools Python入門 第 3 回 ~Logger Utility - 変化を求めるデベロッパーを応援するウェブマガジン | AWS)
まぁちょっと直せばDate型にできそうだなと思ったので、ChatGPT-4にスニペット書いてもらってついでに記事にした。
イントロ
AWS Lambda Powertoolsは非常に便利なユーティリティで、AWS Lambdaの開発を容易にするための数々の機能を提供しています。しかし、時にはそのロギングに使用される日付フォーマットが少しわかりづらくなることがあります。
例: 2023-08-09 03:58:10,866+0000
この記事では、この特定のタイムスタンプの形式をJavaScriptでローカル時刻に変換する方法について説明します。
タイムスタンプの解析
このタイムスタンプの形式は標準的なものではないため、少し工夫して変換する必要があります。以下はその手順です。
手順
- カンマをドットに置換する:タイムスタンプにはカンマが使用されているため、最初にドットに置換します。
- Dateオブジェクトの作成:カンマをドットに置換した後、JavaScriptのDateオブジェクトを作成します。
- ローカル時刻に変換する:Dateオブジェクトをローカル時刻に変換します。
コード例
以下は、このタイムスタンプをローカル時刻に変換するコード例です。
const timestamp = "2023-08-09 03:58:10,866+0200";
const adjustedTimestamp = timestamp.replace(',', '.');
const date = new Date(adjustedTimestamp);
const localDate = date.toLocaleString();
console.log(localDate);
このコードは、与えられた日付と時刻をJavaScriptのDateオブジェクトに変換し、その後toLocaleString
メソッドを使用してローカル時刻に変換します。
ただし、この例のタイムスタンプの形式が標準的でないため、一部のブラウザではうまく動作しない可能性があります。もし問題がある場合は、以下のようにタイムスタンプを手動で解析することもできます。
const timestamp = "2021-05-03 10:20:19,650+0200";
const parts = timestamp.split(/[- :+,]/);
// オフセットの部分を取得して、分単位に変換
const offset = parseInt(parts[7], 10) / 100 * 60;
// Date.UTCでUTC時刻を計算し、オフセットを考慮
const date = new Date(Date.UTC(parts[0], parts[1] - 1, parts[2], parts[3], parts[4], parts[5], parts[6]) - offset * 60 * 1000);
const localDate = date.toLocaleString();
console.log(localDate);
このコードは、与えられた文字列を解析して日付、時刻、およびタイムゾーンの各部分を取得し、それらを使用してDateオブジェクトを構築します。そして、このDateオブジェクトをローカル時刻に変換します。
まとめ
標準的な日付フォーマットとは異なるものに対処する際には、このように少し手間がかかることがあります。もし、このような変換がプロジェクトで頻繁に必要な場合、共通のユーティリティ関数として切り出して再利用すると良いかもしれません。
また、日付操作のライブラリ(例:moment.js、date-fnsなど)を使用することも考慮に入れると良いかもしれません。これらのライブラリは、様々なフォーマットの日付を扱う際に非常に便利です。
このユーティリティを使用して開発する際に役立つことを願っています。
寸評
こんなスニペットでも記事にしておくと案外役に立つものなので、備忘録。オフセットがある場合とか地味にしんどいわ(普通UTCかローカルタイムのどっちかだと思うけど)。ただ簡単な記事だが、オフセットの計算で一度ChatGPTが謎の暴走していたりする……。絵文字使って言い訳しててなんか笑った。