Memos About Salesforce

Salesforceにハマってたこと!

SFDC 時間差分計算 二つ Datetime項目

f:id:jude2016:20190920155743j:plain
programming

こんにちは、管理人の@Salesforce.Zです。

数式で、二つのDatetime項目の差分を求めたい時にtimevalue関数の問題で、

60秒は繰り上げない、60分繰り上げないになってしまう。

今回、プログラムで、このDatetime項目の差分を求める例を提供したいと思います。

間違えた場合、ご指摘を宜しくお願い致します。

読んだら得ること

★ コード2つのDatetime項目の差分を求める方法

目次

日付時間の差分を計算する

数式の場合

通話時間を求めるとか、テスト時間を求めるとか、いろんな時間を求める例がある

今回、サンプルだけです、問題点は60秒、60分になった場合、繰り上げない

IF(
  EndDatetime__c - StartDatetime__c > 0 ,
  LPAD(TEXT( FLOOR( MOD( (EndDatetime__c - StartDatetime__c ) * 24, 24 ) ) ),2,"0") & ":"
  & 
  LPAD(TEXT( ROUND( MOD( (EndDatetime__c - StartDatetime__c) * 24 * 60, 60 ), 0 ) ),2,"0")  & ":"
  & 
  LPAD(TEXT( ROUND( MOD( (EndDatetime__c - StartDatetime__c) * 24 * 60 * 60, 60 ), 0 ) ),2,"0")
, "")

コードの場合

//日付時間の差分を求める
Decimal millisecs = decimal.valueOf(sObject.EndDatetime__c.getTime() -sObject.CallStartDatetime__c.getTime());

//計算結果を文字列に格納する
String resultStr = combineTime(millisecs);

private String combineTime(Decimal millisecs){
        String result = '';
        if(millisecs > 0){
            Decimal dDays = millisecs/1000/60/60/24;
            Integer iDays = integer.valueOF(math.floor(dDays));
            Decimal remainderDays = dDays- iDays;

            Decimal dHours = remainderDays * 24;
            Integer iHours = integer.valueOf(math.floor(dHours));
            Decimal remainderHours = dHours - iHours;

            Decimal dMinutes = remainderHours * 60;
            Integer iMinutes = integer.valueOf(math.floor(dMinutes));
            Decimal remainderMinutes = dMinutes - iMinutes;

            Decimal dSeconds = remainderMinutes * 60;
            Integer iSeconds = integer.valueOf(math.floor(dSeconds));
            Decimal remainderSeconds = dSeconds - iSeconds;
            system.debug('*****************************************************');
            system.debug('Days: ' + iDays+' - '+'Hours: ' + iHours+' - '+'Minutes: ' + iMinutes+' - '+'Seconds: ' + iSeconds);
            system.debug('*****************************************************');

            result = String.valueOf(iHours).leftPad(2, '0');
            result += ':';
            result += String.valueOf(iMinutes).leftPad(2, '0');
            result += ':';

            result += String.valueOf(iSeconds).leftPad(2, '0');
            result += '.000';
        }
        return result;
    }

終わりに

日付時間の差分を求めるには、数式でも簡単にできる、しかし、その結果は60秒や60分になってしまう

繰り上げない問題点を簡単に解決できたら、いいな、公式関数もいずれか、対応してくれるようになるだろう