Seagate DateCode の変換方法

  • 0
    Like
  • 0
    Comment

    Seagate製造のドライブに記載されているDateCodeの計算方法

    計算

    • 書式は YYwd [w=1-9] 又は YYwwd [ww=10-53]
    • 7月第1土曜をYY-1年の第1週の開始日とする
      • 例:2017/07/01 (Sat) → 18年の第1週は7/1
    • wは週としてdは日数として計算する
      • 例:16112 → 2015/07/04 (Sat) + (11-1)*7 + 2 → 2015/09/14 (Mon)
    • 土曜始まりの会計年度というのがポイント?

    実装例

    JavaScript

    sgDate.js
    function sgDate( str ) {
      // Convert Seagate DateCode to YYYY/MM/DD
      var sy = 1999;
      var sw = 1;
      var sd = 0;
    
      // Format: YYwd YYwwd
      if ( str.length < 4 ){
        return "";
      } else if ( str.length < 5 ){
        sy += parseInt(str.substr(0,2)); 
        sw = parseInt(str.substr(2,1));
        sd = parseInt(str.substr(3,1));
      } else {
        sy += parseInt(str.substr(0,2)); 
        sw = parseInt(str.substr(2,2));
        sd = parseInt(str.substr(4,1));
      }
    
      try{
        // Begins from first Saturday of July 1999
        var d = new Date(sy,6,1);
        d.setTime( d.getTime() - d.getTimezoneOffset()*60*1000 );
        d.setDate( d.getDate() + 6 - d.getDay() ); 
        // Add weeks and days
        d.setDate( d.getDate() + sw * 7 - 7);
        d.setDate( d.getDate() + sd );
        return( d.toISOString().slice(0,10).replace(/-/g,"/") );
      }catch(e){
        return "Invalid string"; 
      }
    }
    

    moment.js

    計算部分は moment.js を使うと少し見やすくなる

    // require moment.js
      var dm = moment({ Y:sy, M:6, d:1 });
      dm.add( 6 - dm.day(), 'd');    
      dm.add( sw, 'w' );
      dm.add( sd, 'd' );
      return( dm.format("YYYY/MM/DD (ddd)") );
    

    備考

    PHP実装をJavaScriptで再実装した機会にまとめることに
    特定ロット不良といった不具合期間は避けたいですね :-(

    参考文献

    www.lerti.fr/web/public/NoteTechnique03-v1.01.pdf