2つの日時, 経過時間の計算
2つの日時, 経過時間の計算 (Two Datetimes, Calculate Duration)

日時Aから日時Bまでの経過時間を算出します。数値(days)・数値(hours)・数値(minutes)・文字列(h:mm)のいずれかもしくは複数を出力することが可能です。Bが過去時刻であった場合はマイナス符号が付与されます。ABには日付型データを指定することも可能です。

2020-04-22 (C) Questetra, Inc. (MIT License)
https://support.questetra.com/ja/addons/two-datetimes-calculate-duration/

Configs
  • A: 日時型データを選択してください *
  • B: 日時型データを選択してください *
  • C: 経過日数(Days)が格納される数値型データを選択してください (更新)
  • D: 経過時間数(Hours)が格納される数値型データを選択してください (更新)
  • E: 経過分数(Minutes)が格納される数値型データを選択してください (更新)
  • F: 経過時間文字列(h:mm)が格納される文字列型データを選択してください (更新)
Script
// Nashorn Script (engine type: 1)
// 
// Notes:
// The number of decimal places for Days and Hours depends on the numeric definition.
// "00:00" is applied when Date type data is compared.
// If Date subtype "YM", "-01" is added.
// If Date subtype "Y", "-01-01" is added.
// If Date subtype "MD", 'YYYY-' as of processing is added.
// 
// Notes(ja):
// Days や Hours の小数点以下桁数は、格納される数値型データ項目の定義に依ります。
// 日時型(Datetime)ではなく日付型(Date)データが比較される場合 00:00 が適用されます。
// 日付型(Date)でサブタイプが「YM」の場合、"01日" が補完されます。
// 日付型(Date)でサブタイプが「Y」の場合、"01月01日" が補完されます。
// 日付型(Date)でサブタイプが「MD」の場合、"処理時の年" が補完されます。


//////// START "main()" /////////////////////////////////////////////////////////////////
main();
function main(){ 

//// == Config Retrieving / 工程コンフィグの参照 ==
const dataIdA = configs.get( "conf_DataIdA" ) + "";  // config required
const dataIdB = configs.get( "conf_DataIdB" ) + "";  // config required
const dataIdC = configs.get( "conf_DataIdC" ) + "";  // config not required
const dataIdD = configs.get( "conf_DataIdD" ) + "";  // config not required
const dataIdE = configs.get( "conf_DataIdE" ) + "";  // config not required
const dataIdF = configs.get( "conf_DataIdF" ) + "";  // config not required


//// == Data Retrieving / ワークフローデータの参照 ==
if( engine.findDataByNumber( dataIdA ) === null ){
  throw new Error( "\n AutomatedTask UnexpectedDatetimeError:" +
                   " Datetime {A} is null \n" );
}
if( engine.findDataByNumber( dataIdB ) === null ){
  throw new Error( "\n AutomatedTask UnexpectedDatetimeError:" +
                   " Datetime {B} is null \n" );
}
let strDateA = engine.findDataByNumber( dataIdA ) + ""; // "2020-04-30 12:59"
let strDateB = engine.findDataByNumber( dataIdB ) + ""; // "2020-04-30"

const regBpmsY  = /^\d{4}$/;       // "2020"
const regBpmsYM = /^\d{4}-\d{2}$/; // "2020-04"
const regBpmsMD = /^\d{2}-\d{2}$/; // "04-30"
engine.log( " AutomatedTask String A: " + strDateA );
if( regBpmsY.test( strDateA ) ){
  strDateA = strDateA + "-01-01";
  engine.log( " AutomatedTask String A (as): " + strDateA );
}
if( regBpmsYM.test( strDateA ) ){
  strDateA = strDateA + "-01";
  engine.log( " AutomatedTask String A (as): " + strDateA );
}
if( regBpmsMD.test( strDateA ) ){
  let  now = new Date();
  strDateA = now.getFullYear() + "-" + strDateA;
  engine.log( " AutomatedTask String A (as): " + strDateA );
}
engine.log( " AutomatedTask String B: " + strDateB );
if( regBpmsY.test( strDateB ) ){
  strDateB = strDateB + "-01-01";
  engine.log( " AutomatedTask String B (as): " + strDateB );
}
if( regBpmsYM.test( strDateB ) ){
  strDateB = strDateB + "-01";
  engine.log( " AutomatedTask String B (as): " + strDateB );
}
if( regBpmsMD.test( strDateB ) ){
  let  now = new Date();
  strDateB = now.getFullYear() + "-" + strDateB;
  engine.log( " AutomatedTask String B (as): " + strDateB );
}


//// == Calculating / 演算 ==
const dateA = toJsDate( strDateA ); // ECMA/JavaScript Date
const dateB = toJsDate( strDateB );
const numMilliEpochA = dateA.getTime();
const numMilliEpochB = dateB.getTime();
const numMilliDuration = numMilliEpochB - numMilliEpochA;


//// == Data Updating / ワークフローデータへの代入 ==
if( dataIdC !== "" ){
  engine.setDataByNumber( dataIdC,
    new java.math.BigDecimal( numMilliDuration /1000 /60 /60 /24 )
  );
}
if( dataIdD !== "" ){
  engine.setDataByNumber( dataIdD,
    new java.math.BigDecimal( numMilliDuration /1000 /60 /60 )
  );
}
if( dataIdE !== "" ){
  engine.setDataByNumber( dataIdE,
    new java.math.BigDecimal( numMilliDuration /1000 /60 )
  );
}
if( dataIdF !== "" ){
  let hour = parseInt( numMilliDuration /1000 /60 /60 );
  let min  = Math.abs(parseInt(( numMilliDuration /1000 /60 ) %60));
  if( min < 10 ){ min = "0" + min; }
  engine.setDataByNumber( dataIdF, hour + ":" + min );
}


} //////// END "main()" /////////////////////////////////////////////////////////////////


function toJsDate( bpmsDateOrDatetimeStr ){
  // BPMS Date:     "2020-04-01"  (subtype "Y/M" "M/D" "Y", not supported)
  // BPMS Datetime: "2020-04-01 23:59"
  let year       = 0;
  let monthIndex = 0;
  let day        = 0;
  let hours      = 0;
  let minutes    = 0;

  //  The ECMA/JavaScript Date object has a large number of methods.
  // "Date.parse" is danger (strongly discouraged)
  // - new Date("2014-11-10") // Mon Nov 10 2014 09:00:00 GMT+0900 (JST)
  // - new Date(2014, 10, 10) // Mon Nov 10 2014 00:00:00 GMT+0900 (JST)
  let arrDatetime = bpmsDateOrDatetimeStr.split(" ");
  if( arrDatetime.length === 1 ){
    let arrDateParts = arrDatetime[0].split("-");
    year       = parseInt(arrDateParts[0], 10);
    monthIndex = parseInt(arrDateParts[1], 10) - 1;
    day        = parseInt(arrDateParts[2], 10);
  }
  if( arrDatetime.length === 2 ){
    let arrDateParts = arrDatetime[0].split("-");
    let arrTimeParts = arrDatetime[1].split(":");
    year       = parseInt(arrDateParts[0], 10);
    monthIndex = parseInt(arrDateParts[1], 10) - 1;
    day        = parseInt(arrDateParts[2], 10);
    hours      = parseInt(arrTimeParts[0], 10);
    minutes    = parseInt(arrTimeParts[1], 10);
  }
  return new Date( year, monthIndex, day, hours, minutes );
}

Download

Capture

日時Aから日時Bまでの経過時間を算出します。数値(days)・数値(hours)・数値(minutes)・文字列(h:mm)のいずれかもしくは複数を出力することが可能です。Bが過去時刻であった場合はマイナス符号が付与されます。ABには日付型データを指定することも可能です。

Notes

  1. Days や Hours の小数点以下桁数は、格納される数値型データ項目の定義に依ります。
  2. 日時型(Datetime)ではなく日付型(Date)データが比較される場合 00:00 が適用されます。
  3. 日付型(Date)でサブタイプが「YM」の場合、”01日” が補完されます。
  4. 日付型(Date)でサブタイプが「Y」の場合、”01月01日” が補完されます。
  5. 日付型(Date)でサブタイプが「MD」の場合、”処理時の年” が補完されます。

See also

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

%d人のブロガーが「いいね」をつけました。