RegulateDateText (dateText)

3年前に作った FileMaker カスタム関数。
全角だったりスラッシュ抜けてたり昭和とか元年とかの適当な日付を表す文字列をちゃんとした日付にする…という機能の他に、tomorrow だの yesterday だの sunday だのといった相対的な日付を表す単語も判断して、自動的にその日付が入力される。

使い方は…OnObjectValidate で、
フィールド設定 [ RegulateDateText ( Get ( アクティブフィールド内容 ) ) ]
※ [ターゲットフィールドを指定]のチェックをオフ
というだけの1行のスクリプトを、Kick してやるだけでOK!

/*
created 2013/05/14 12:58:19 by bison.
modified 2013/05/16 05:35:25 by bison.
-------------------------------------
 PURPOSE
-------------------------------------
以下のどの場合も、1961/03/16 の日付として扱う
※ 数値やスラッシュが全角でもOK
※ スラッシュの代わりにピリオドで書かれていてもOK
  1961/3/16
  19610316
  昭和36/3/16
  昭36/03/16
  s360316
  昭和360316

また、以下のテキストも大文字小文字全角半角に関わらず、
自動的に日付に変換する
  today
  tomorrow
  yesterday
  sun もしくは sunday
  mon もしくは monday
  tue もしくは tuesday
  wed もしくは wednesday
  thu もしくは thursday
  fri もしくは friday
  sat もしくは saturday
※ 曜日はすべて直近未来の曜日
-------------------------------------
 PARAMETER
-------------------------------------
dataText --- 日付を表す上記例のようなテキスト
-------------------------------------
 CAUTION
-------------------------------------
日付フィールドの機能を拡張するために、
OnObjectValidate で使うことを想定。
-------------------------------------
  START
-------------------------------------
*/

Let ( [

// 前後のゴミとって英数は半角大文字
dateText = Upper ( RomanHankaku ( Trim ( dateText ) ) ) ;

// 昭和・昭・元・年・月・日・.(ピリオド)などの文字を処理
// この部分は、シャモピーの YearNameToDate 関数からほぼパックンチョ
// http://www.fmpro.jp/fmi/xsl/plugin/cf.xsl?ID=0016

dateText = Substitute (
  dateText ;
  [ "西暦" ; "" ] ;
  [ "明治" ; "M" ] ; [ "明" ; "M" ] ;
  [ "大正" ; "T" ] ; [ "大" ; "T" ] ;
  [ "昭和" ; "S" ] ; [ "昭" ; "S" ] ;
  [ "平成" ; "H" ] ; [ "平" ; "H" ] ;
  [ "元" ; "1" ] ;
  [ "年" ; "/" ] ; [ "月" ; "/" ] ; [ "日" ; "" ] ;
  [ "." ; "/" ]
  ) ;

// 半角数字および /(スラッシュ)部分 例)360316
~nText = Filter ( dateText ; "0123456789/" ) ;

// 日付を表す相対的なテキストの処理
~relativeDate =
  Case (
  dateText = "TODAY" ; Get ( 日付 ) ;
  dateText = "TOMORROW" ; Get ( 日付 ) + 1 ;
  dateText = "YESTERDAY" ; Get ( 日付 ) - 1 ;
  dateText = "SUN" or dateText = "SUNDAY" ;
  Get ( 日付 ) - Mod ( DayOfWeek ( Get ( 日付 ) ) - 1 ; 7 ) + 7 ;
  dateText = "MON" or dateText = "MONDAY" ;
  Get ( 日付 ) - Mod ( DayOfWeek ( Get ( 日付 ) ) - 2 ; 7 ) + 7 ;
  dateText = "TUE" or dateText = "TUESDAY" ;
  Get ( 日付 ) - Mod ( DayOfWeek ( Get ( 日付 ) ) - 3 ; 7 ) + 7 ;
  dateText = "WED" or dateText = "WEDNESDAY" ;
  Get ( 日付 ) - Mod ( DayOfWeek ( Get ( 日付 ) ) - 4 ; 7 ) + 7 ;
  dateText = "THU" or dateText = "THURSDAY" ;
  Get ( 日付 ) - Mod ( DayOfWeek ( Get ( 日付 ) ) - 5 ; 7 ) + 7 ;
  dateText = "FRI" or dateText = "FRIDAY" ;
  Get ( 日付 ) - Mod ( DayOfWeek ( Get ( 日付 ) ) - 6 ; 7 ) + 7 ;
  dateText = "SAT" or dateText = "SATURDAY" ;
  Get ( 日付 ) - Mod ( DayOfWeek ( Get ( 日付 ) ) - 7 ; 7 ) + 7
) // Case

] ;


// スラッシュが無くて、数値部分が6桁の場合:例)S360316 -> S36/03/16
Case ( PatternCount ( ~nText ; "/" ) = 0 ;
  Case ( Length ( ~nText ) = 6 ;
    GetAsDate (
    Filter ( dateText ; "MTSH" ) & Left ( ~nText ; 2 ) & "/" & Middle ( ~nText ; 3 ; 2 ) & "/" & Middle ( ~nText ; 5 ; 2 )
    ) ; // GetAsDate
// スラッシュが無くて、数値部分が8桁の場合:例)19610316 -> 1961/03/16
    Length ( ~nText ) = 8 ;
    GetAsDate (
    Left ( ~nText ; 4 ) & "/" & Middle ( ~nText ; 5 ; 2 ) & "/" & Middle ( ~nText ; 7 ; 2 )
    ) ; // GetAsDate
// スラッシュが無いそれ以外の場合は、日付を表す相対的なテキストだと判断する
    ~relativeDate
  ) ; // Case
  GetAsDate ( dateText )
) // Case
) // Let

comments powered by Disqus