【Salesforce開発】Apexで現在の日付を取得する方法

※本サイトにはプロモーション・広告が含まれています。

(最終更新月: 2024年2月)

✔以下の疑問をお持ちの方へ向けた記事です

「Salesforce Apexで現在の日付をどのように取得するのか?」
「現在の日付を取得する際のコーディングのベストプラクティスは?」
「Apexで取得した現在の日付の活用例は?」

✔当記事を読むことで得られる知識

  • Salesforce Apexにおける現在の日付の取得方法
  • 現在の日付の取得に関するコーディングのベストプラクティス
  • Apexで取得した現在の日付を活用する具体的な使用例

Apexでの日付と時刻の取り扱いは、レポートの生成、期限の計算、時間依存のプロセスの制御など、多くのアプリケーション開発シナリオで重要です。

当記事では、Date.today()Datetime.now()など、Apexで現在の日付や時刻を取得するためのメソッドを紹介し、それらを効果的に使用するためのコーディングのヒントを提供します。

Salesforceの開発者にとって、日付関連の処理を正確かつ効率的に行うためのガイドとなるでしょう。

ぜひ最後までご覧ください。

Salesforce

定義や属性などは公式ガイドを必ず参考にしましょう。

当記事では、主にその使い方を具体例とともに解説します。

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

プロダクトマネージャーとして、Apex・Visualforceの開発エンジニアとして、以下のようなプロジェクトに従事してきました

  • 新規事業の立ち上げに伴うビジネスプロセス構築とSalesforceのカスタマイズ
  • SFDXを活用した大規模リリース
  • Visualforce等による一般ユーザー向けサイト・アプリケーションの構築

相談・業務の依頼も承ります。ご質問・ご希望をお問い合わせください。

Apexにおける日付の基本

Apexでプログラミングする際、日付とタイムスタンプの扱いは欠かせません。

こちらでは、Apexでの日付の基本について詳しく見ていきます。

これを理解することで、Apexを使用した開発がより効果的かつ効率的になるでしょう。

  • 日付とタイムスタンプの扱い
  • Date と Datetime クラスの基本
  • システム日付とカスタム日付フィールド

日付とタイムスタンプの扱い

Apexでは、日付とタイムスタンプを表すために特定のクラスとメソッドが用意されています。

  • 日付: Dateクラス
  • タイムスタンプ: Datetimeクラス

例えば、今日の日付を取得するにはDate.today()を、現在のタイムスタンプを取得するにはDatetime.now()を使います。

Date currentDate = Date.today();
Datetime currentTimestamp = Datetime.now();

これらのクラスを使うことで、日付や時間の操作、計算が可能になります。

Date と Datetime クラスの基本

Dateクラスは年、月、日の情報だけを扱うために使用されます。

一方、Datetimeクラスは日付に加えて時刻の情報も含んでおり、これによりタイムスタンプの表現が可能。

これらのクラスのインスタンスを生成するには、以下のようなコードを書きます。

Date aDate = Date.newInstance(2023, 4, 1);
Datetime aDatetime = Datetime.newInstance(aDate, Time.newInstance(12, 30, 0, 0));

こうすることで、特定の日付や時刻を持つオブジェクトを作成できます。

システム日付とカスタム日付フィールド

Salesforceには、システム日付とカスタム日付の概念があります。

  • システム日付: 各フィールドに自動で含まれているCreatedDate。レコードが作成される時にDatetime値がセットされる
  • カスタム日付: ビジネスに合わせた日付情報を格納できる

Apexコード内では以下のようにこれらのフィールドを参照できます。

Datetime systemDate = aRecord.CreatedDate;
Date customDate = aRecord.Custom_Date__c;

ここでaRecordは、Salesforceのレコードを指します。

現在の日付の取得方法

アプリケーションやビジネスプロセスにおいて、現在の日付や時刻を取得し扱うことは非常に一般的です。

リアルタイムの情報を活用することが可能になります。

  • System.today() の使用
  • System.now() での現在のタイムスタンプ取得
  • タイムゾーンと日付の扱い

System.today() の使用

System.today()メソッドを使用すると、UTC(協定世界時)に基づいた現在のシステム日付をDate型で取得できます。

以下のようなコードで取得した日付の利用が可能。

Date today = System.today();

このメソッドは例えばレポートの日付フィールドのデフォルト値を設定する際に役立ちます。

System.now() での現在のタイムスタンプ取得

System.now()メソッドによって、現在の日付と時刻を含むDatetimeオブジェクトが得られます。

これはUTCで返されるため、ローカルタイムゾーンへの変換が必要です。

Datetime currentTime = System.now();

これを使用すると、プロセスが実行される正確な時刻をログやタイムスタンプとして記録できます。

タイムゾーンと日付の扱い

タイムゾーンは、日付と時刻のデータを扱う上で重要です。

Datetimeクラスには、UTCからユーザーのローカルタイムゾーンへ変換するためのメソッドがあります。

Datetime currentTime = System.now();
Datetime localTime = currentTime.format('yyyy-MM-dd\'T\'HH:mm:ss', 'JST');

現在のUTCタイムスタンプを日本のタイムゾーンに変換。

この機能はユーザーにタイムゾーンに基づいた情報を提供する際に役立ちます。

日付操作のテクニック

Apexを使って日付を操作する際に知っておくべきテクニックを紹介します。

これらの操作をマスターすることで、日付データを効果的に扱うことができ、より複雑なロジックの実装が可能です。

  • 日付の加算と減算
  • 日付の比較と差分計算
  • 曜日や月などの日付要素の抽出

日付の加算と減算

日付に日数を加算したり減算したりする場合は、DateクラスのaddDays()メソッドを使用します。

たとえば、今日から30日後の日付を取得するには次のとおり。

Date today = System.today();
Date futureDate = today.addDays(30);

同様に、過去の日付を得るにはaddDays()に負の数値を渡します。

日付の比較と差分計算

複数の日付を比較する場合は、DateクラスのdaysBetween()メソッドを使用します。

daysBetweenメソッドは、2つの日付の差分を日数で計算できるものです。

例えば、次のコードは特定の期間内の日数を計算しています。

Date startDate = Date.newInstance(2023, 1, 1);
Date endDate = Date.newInstance(2023, 4, 1);
Integer daysBetween = startDate.daysBetween(endDate);

このメソッドはプロジェクトの期間計画や日数のカウントに便利です。

曜日や月などの日付要素の抽出

特定の日付から曜日や月といった要素を抽出するには、以下のようなメソッドを使用します。

  • Dateクラスのday()
  • month()
  • year()

以下がその例です。

Date someDate = Date.today();
Integer dayOfMonth = someDate.day();
Integer monthOfYear = someDate.month();
Integer yearNumber = someDate.year();

これらは日付ベースのレポート作成やユーザーインターフェースの表示に役立ちます。

Apexでの現在日付の活用例

Apexを使った開発では、現在日付の活用が非常に重要です。

ここでは、現在日付を使う典型的な3つの実践例を解説します。

これにより、Apexでのプログラミングがより具体的で実践的になることでしょう。

  • 期限切れレコードの自動識別
  • 報告期間の動的な計算
  • ユーザー活動の日時追跡

期限切れレコードの自動識別

Apexを使って、現在日付とレコードの期限日を比較し、期限切れレコードを自動で識別できます。

例えば、次のようにして期限が今日を過ぎたタスクを取得。

Date today = System.today();
List<Task> expiredTasks = [SELECT Id, Subject FROM Task WHERE DueDate__c < :today];

これをバッチ処理や自動化ルールと組み合わせることで、期限切れタスクへの通知などが実現できます。

報告期間の動的な計算

レポートや集計の際には、動的な期間計算が必要となることがあります。

以下のコードは今月の初日と最終日を計算しており、月別の集計するコードです。

Date firstDayOfMonth = System.today().toStartOfMonth();
Date lastDayOfMonth = firstDayOfMonth.addMonths(1).addDays(-1);

この技術は期間を限定したデータ集計やレポートで有効です。

ユーザー活動の日時追跡

ユーザーのアクションにタイムスタンプを付けることで、活動分析や不正検知が可能です。

以下はユーザーのログイン時刻を記録する例になります。

Datetime loginTime = System.now();
UserActivity__c activity = new UserActivity__c(
    UserId__c = UserInfo.getUserId(),
    LoginTime__c = loginTime
);
insert activity;

集めたデータはオペレーションの最適化やセキュリティ監視に役立ちます。

日付処理のベストプラクティス

効率的で堅牢なApexコードを書くためには、日付処理に関するベストプラクティスを理解しておくことが重要です。

ここでは、日付処理をおこなう際の推奨される方法を3つ紹介します。

  • 日付リテラルとフォーマットの使用
  • テストクラスでの日付操作
  • ロケールとタイムゾーンの考慮

日付リテラルとフォーマットの使用

日付リテラルは、コード内で固定された日付を表すための便利な方法です。

以下はLAST_N_DAYSリテラルの使用例で、過去30日以内に作成されたレコードを取得します。

List<Account> recentAccounts = [SELECT Id, Name FROM Account WHERE CreatedDate = LAST_N_DAYS:30];

また、format()メソッドを使用して日付や時刻を特定のフォーマットの文字列に変換する事も可能です。

Datetime now = Datetime.now();
String formattedDate = now.format('yyyy-MM-dd HH:mm:ss');

これにより、ユーザーやシステムが要求する特定の形式で日付を表示できます。

テストクラスでの日付操作

Apexのテストクラスでは、テストデータが特定の日付や時間を要する場合に日付の操作が必要です。

Test.setFixedDate()メソッドを用いてシステム日付を固定し、以下のように日付に依存するテストを実行できます。

Test.setFixedDate(2023, 4, 1); // 日付を2023年4月1日に固定
Datetime fixedDateTime = Datetime.now(); // 固定されたシステム日付を得る

これにより、コードのテストが予測可能で安定したものになります。

ロケールとタイムゾーンの考慮

グローバルなアプリケーションを開発する際には、ユーザーのロケールやタイムゾーンに適した日付処理が重要です。

format()メソッドにロケールを指定することで、ローカルな日時フォーマットを実現します。

Datetime now = Datetime.now();
String localTime = now.format('MM/dd/yyyy', 'fr_FR');

これは、ユーザーが自分の国や文化に適した形で日付や時刻を見ることを望んでいる場合に不可欠です。

まとめ

当記事でご説明したことは以下のとおりです。

  • Apexにおける日付の基本
  • 応用的な処理
  • ベストプラクティス

日付および時刻データは、Salesforceプラットフォーム上で動くアプリケーションや自動化ルールの中心となる要素です。

これら情報を活用して、Salesforceで効果的なアプリケーションを開発し、ユーザーにとって有益な機能を提供しましょう。

タイトルとURLをコピーしました