日曜日, 1月 11, 2009

【JavaScript】 ISO8601日時をパースする正規表現。ついでにJavaも このエントリーを含むはてなブックマーク



"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 件のコメント:

 
© 2006-2015 Virtual Technology
当サイトではGoogle Analyticsを使ってウェブサイトのトラフィック情報を収集しています。詳しくは、プライバシーポリシーを参照してください。