LoginSignup
20
14

More than 1 year has passed since last update.

[Apex] 日付・日時 と 文字列の変換

Last updated at Posted at 2019-11-28

日付・日時 と 文字列 の変換

Date → String

Date→String
Date d = Date.newInstance(2019, 6, 10);
String.valueOf(d); // 2019-06-10
d.format();        // 2019/06/10 (戻り値のStringはコンテキストユーザのロケールの日付形式)
Datetime.newInstance(d.year(), d.month(), d.day()).format('M/d(E)'); // 6/10(Mon)

String → Date

String→Date
Date.parse('2019/06/10'); // 2019-06-10 (引数はコンテキストユーザのロケールの日付形式)
Date.parse('2019/6/10');  // 2019-06-10

Date.valueOf('2019-06-10'); // 2019-06-10
Date.valueOf('2019-6-10');  // 2019-06-10
Date.valueOf('2019-06-10T00:00:00');       // 2019-06-10
Date.valueOf('2019-06-10T00:00:00+09:00'); // 2019-06-10
Date.valueOf('2019-06-10 00:00:00+09:00'); // 2019-06-10
Date.valueOf('2019-06-10 20:00:00-08:00'); // 2019-06-10

Datetime → String

Datetime→String
Datetime dt = Datetime.newInstance(2019, 6, 10, 1, 23, 45);
String.valueOf(dt);    // 2019-06-10 01:23:45
String.valueOfGmt(dt); // 2019-06-09 16:23:45

dt.format(); // 2019/06/10 1:23
dt.format('yyyy-MM-dd\'T\'HH:mm:ssXXX'); // 2019-06-10T01:23:45+09:00 (フォーマットについては下記のリンクを参照)
dt.format('yyyy-MM-dd\'T\'HH:mm:ssXXX', 'America/New_York');  // 2019-06-09T12:23:45-04:00
dt.formatGmt('yyyy-MM-dd\'T\'HH:mm:ssXXX'); // 2019-06-09T16:23:45Z

String → Datetime

String→Datetime
Datetime.parse('2019/06/10 01:23'); // 2019-06-10T01:23:00+09:00

Datetime.valueOf('2019-06-10 01:23:45');       // 2019-06-10T01:23:45+09:00
Datetime.valueOf('2019-06-10 01:23:45Z');      // 2019-06-10T01:23:45+09:00
Datetime.valueOf('2019-06-10 01:23:45+0900');  // 2019-06-10T01:23:45+09:00
Datetime.valueOf('2019-06-10 01:23:45+09:00'); // 2019-06-10T01:23:45+09:00

Datetime.valueOfGmt('2019-06-10 01:23:45');       // 2019-06-10T10:23:45+09:00
Datetime.valueOfGmt('2019-06-10 01:23:45Z');      // 2019-06-10T10:23:45+09:00
Datetime.valueOfGmt('2019-06-10 01:23:45+0900');  // 2019-06-10T10:23:45+09:00
Datetime.valueOfGmt('2019-06-10 01:23:45+09:00'); // 2019-06-10T10:23:45+09:00
  • Datetime#parse は、引数のStringに秒数を含めるとエラーになる
  • Datetime#valueOf は、引数のStringに秒数を含めないとエラーになる
  • Datetime#valueOf と Datetime#valueOfGmt は、yyyy-MM-dd HH:mm:ssのみ評価され、タイムゾーンの指定は無視される。
  • Datetime#valueOf の引数はローカルタイムとみなされる。
  • Datetime#valueOfGmt の引数はGMTとみなされる。
  • Datetime.newInstance(year, month, day, hour, minute, second)

日付 と 日時 の変換

Date → Datetime

Date→Datetime
Date d = Date.newInstance(2019, 6, 10);
Datetime.newInstance(d.year(), d.month(), d.day()); // 2019-06-10T00:00:00+09:00
  • Date.newInstance(year, month, day): 引数はいずれもInteger型
  • Time.newInstance(hour, minutes, seconds, milliseconds): 引数はいずれもInteger型
  • Datetime.newInstance(date, time): dateはDate型、timeはTime型
  • Datetime.newInstance(hour, minutes, seconds, milliseconds): 引数はいずれもInteger型

Datetime → Date

Datetime→Date
Datetime dt = Datetime.newInstance(2019, 6, 10, 1, 23, 45);
dt.date();        // 2019-06-10 (ローカルタイムの日付を返す)
dt.dateGMT();     // 2019-06-09 (GMTの日付を返す)

// 参考
Date.valueOf(dt); // 2019-06-09 04:00:00 (※注意)
  • DatetimeのDateへの変換はDatetime#dateを使用する。Date#valueOfは、履歴SObjectのOldValue項目またはNewValue項目で使用する。
  • Datetimeを Date#valueOf で変換すると時間を含むDate型となってしまう。比較演算子を使用するときは注意が必要(見かけ上は同じ値だが、「==」でfalseになるなど)。

Appendix

エポック秒(UNIX秒)の変換

// エポック秒 → Datatime
Long epochSec = 1560097380L;
Datetime dt = Datetime.newInstance(epochSec * 1000); // 2019-06-10T01:23:00+09:00

// Datetime → エポック秒
Datetime dt2 = Datetime.newInstance(2019, 06, 10, 01, 23, 00);
Long epochSec2 = dt2.getTime() / 1000; // 1560097380L

Date.newInstanceについて

  • Date.newInstanceの月、日に存在しない値を設定した場合、繰下げ・繰上げが行われる。
    • Date.newInstance(2019, 13, 10) → 2020-01-10
    • Date.newInstance(2019, 0, 10) → 2018-12-10
    • Date.newInstance(2019, -1, 10) → 2018-11-10

参考

20
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
14