Salesforce ApexでISO-8601形式の日付文字列をDatetime型に変換する

Salesforce ApexでISO-8601形式の日付文字列をDatetime型に変換する

Clock Icon2025.03.04

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の組み合わせを使うなど、状況にあわせて使い分けるのが良さそうです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.