
Salesforce ApexでISO-8601形式の日付文字列をDatetime型に変換する
AWSのS3 APIのListObjectsV2を使い取得したLastModifiedの値をApexでDatetime型に変換する際に、少し悩んだので備忘録として書き残します。
前提
S3 APIのListObjectsV2では下記のようなISO-8601の拡張形式でLastModifiedの値を取得できます。
2025-01-01T13:00:00.000Z
JSON.deserialize
JSONクラスのdeserializeメソッドを使用してDatetime型に変換します。
String dtStr = '2025-01-01T13:00:00.000Z';
Datetime dt = (Datetime)JSON.deserialize('"' + dtStr + '"',Datetime.class);
System.debug(dt);
2025-01-01 13:00:00
replaceとvalueOfGmtの組み合わせ
StringクラスのreplaceメソッドとDatetimeクラスのvalueOfGmtメソッドを組み合わせて変換します。
String dtStr = '2025-01-01T13:00:00.000Z';
Datetime dt = Datetime.valueOfGmt(dtStr.replace('T', ' ').replace('Z', ''));
System.debug(dt);
2025-01-01 13:00:00
どちらも同じ結果を得られました。
処理時間の比較
それぞれDatetime型への変換を10000回行い、処理時間を計測します。
JSON.deserialize
for (Integer i = 0; i < 10000; i++) {
String dtStr = '2025-01-01T13:00:00.000Z';
Datetime dt = (Datetime)JSON.deserialize('"' + dtStr + '"',Datetime.class);
}
System.debug('Limits.getCpuTime: ' + Limits.getCpuTime() );
Limits.getCpuTime: 1558
replaceとvalueOfGmtの組み合わせ
for (Integer i = 0; i < 10000; i++) {
String dtStr = '2025-01-01T13:00:00.000Z';
Datetime dt = Datetime.valueOfGmt(dtStr.replace('T', ' ').replace('Z', ''));
}
System.debug('Limits.getCpuTime: ' + Limits.getCpuTime() );
Limits.getCpuTime: 601
計算コストはJSON.deserializeの方が高い結果となりました。
まとめ
JSON.deserializeは計算コストが高いですが、様々なISO-8601形式のバリエーションに対応できるというメリットがあります。
逆にreplaceとvalueOfGmtの組み合わせは計算コストが低いですが、様々なISO-8601形式のバリエーションには対応できません。
入力形式が一定ではなく少量のデータを処理する場合はJSON.deserializeを、入力形式が一定かつ大量のデータを処理する場合はreplaceとvalueOfGmtの組み合わせを使うなど、状況にあわせて使い分けるのが良さそうです。