RegulateDateText (dateText)
使い方は…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
] ;
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