Tips

日付のフォーマットを整える

日付2017/09/28
ID17-003
バージョンv15以降
プラットフォームWin, Mac

インターネットにアクセスして得られた日付が、どうも扱いにくいと思うことがあるかもしれません。例えば、相手先サーバから返された文字列が次のような時です。

Wed Sep 27 2017 12:03:56 GMT+0900

この文字列を4DのDATEコマンドに渡しても日付として評価されません。 そこで、こうしたフォーマットをよく扱う他の言語に頼り、4Dで扱いやすい文字列に変換することが求められます。

真っ先に思いつくのは、PHPです。PHP Executeコマンドで評価させれば、PHPのライブラリで簡単に評価できます。 しかしPHP Executeコマンド以外の方法、言い換えるならPHP以外の言語に処理させることも可能です。

後述の例題は、それぞれのプラットフォームに合わせたjsファイルを用意して、メソッドから実行するコード例です。このコードでは、jsファイルをResourcesフォルダ内のJavaScriptsフォルダに配置することを想定しています。

これを実行して、冒頭の日付文字列から得られる結果は…

注:結果はマシン環境で差があることがあります

このように整形されれば、4Dのプログラムで扱うのは容易いでしょう。

余談ですが、冒頭のフォーマットの日付文字列以外でも、日付と認識されれば変換可能ですから、色々と試してみてください。

JavaScriptファイル

Windows用(ファイル名:date_fomat_normalization_win.js)

// standard stream
var stdin = WScript.StdIn;
var stdout = WScript.StdOut;

var str = stdin.ReadLine();
var dateObj = new Date(str);

stdout.WriteLine(dateObj.toLocaleString());

macOS用(ファイル名:date_fomat_normalization_mac.js)

// standard stream
var global = this,stdin;

var str = global.readline();
var dateObj = new Date(str);

print(dateObj.toLocaleString());

4Dメソッド

//JavaScriptで日付フォーマットの変換をする
// $1; 整形前の日付文字列
// $0; 整形後の日付文字列

C_TEXT($0)
C_TEXT($1)

C_LONGINT($pos;$len)
C_TEXT($input;$output;$error)

$input:=Choose($1="";"Dummy";$1)  //空白を避ける

$path:=Get 4D folder(Current resources folder)+"JavaScripts"+Folder separator

If (Folder separator=":")  //Macか?
	
	  //Mac用
	$path:=Convert path system to POSIX($path+"date_fomat_normalization_mac.js")
	LAUNCH EXTERNAL PROCESS("/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc \""+$path+"\"";$input;$output;$error)

Else 
	
	  //Windows用
	$path:=$path+"date_fomat_normalization_win.js"
	SET ENVIRONMENT VARIABLE("_4D_OPTION_HIDE_CONSOLE";"true")
	LAUNCH EXTERNAL PROCESS("cscript \""+$path+"\"";$input;$output;$error)
	  //Windowsの場合、後処理が必要
	If (Match regex("[0-9]{4}.*";$output;1;$pos;$len))
		$output:=Substring($output;$pos;$len)
	Else 
		$output:="Invalid Date"
	End if 

End if 

$0:=$output