"2002-06-17T09:25:43.4670000+01:00" のようなフォーマットのISO8601日時をDateにして返す関数はJavaScriptでは以下のようになる。正規表現を使ってマッチした()の1つ目が$1、2つ目が$2・・・7つめが$7に入る。(replace()関数外のためRegExp.$7のように参照している)
// http://www.merlyn.demon.co.uk/js-date3.htm#XML
function parseISO8601(isodatetime) {
var newdate = isodatetime.replace(/^(\d{4})-(\d{2})-(\d{2})T([0-9:]*)([.0-9]*)(.)(.*)$/,'$1/$2/$3 $4 GMT');
newdate = Date.parse(newdate) + 1000*RegExp.$5;
var k = +1;
newdate -= k * Date.parse('1970/01/01 '+RegExp.$7+' GMT') * (RegExp.$6+'1');
return new Date(newdate);
}
ちなみにJavaではこんな感じ、
protected Object fromString(String str) {
try {
// Date/Time ISO8601 TIME ZONE FORMAT 2006-02-10T10:00Z.
// slow but,thread safe
SimpleDateFormat isoformat = new SimpleDateFormat(
"yyyy-MM-dd'T'HH:mm:ssZZ");
return isoformat.parse(str);
} catch (ParseException e) {
// try with next formatter
}
}
protected String toString(Object obj) {
SimpleDateFormat isoformat = new SimpleDateFormat(
"yyyy-MM-dd'T'HH:mm:ssZZ");
return isoformat.format(obj);
}
Javaの正規表現
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Iso8601 {
/**
* ISO8601日時を正規表現で分解して取得する
*/
public static void main(String[] args) {
Pattern pattern = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})T([0-9:]*)([.0-9]*)(.)(.*)");
Matcher matcher = pattern.matcher("2002-06-17T09:25:43.4670000+01:00");
if (matcher.find()) {
System.out.println("ALL:"+matcher.group(0));
System.out.println("YY:"+matcher.group(1));
System.out.println("MM:"+matcher.group(2));
System.out.println("DD:"+matcher.group(3));
System.out.println("TIME:"+matcher.group(4));
System.out.println("msec:"+matcher.group(5));
System.out.println("+-:"+matcher.group(6));
System.out.println("TZ:"+matcher.group(7));
}
}
}
0 件のコメント:
コメントを投稿