おそらくはそれさえも平凡な日々

あらゆる日付文字列をよしなに扱うgo-httpdate を書いたAdd Star

https://github.com/Songmu/go-httpdate

Perl界には HTTP::Date という便利モジュールがあります。これは、あらゆる日付文字列を特にフォーマットの指定無しによしなにパースしてくれるもので、クイックハックに非常に有用です。ISUCONでは毎回使っている気がします。

このモジュールは異常な正規表現によって成り立っています。おそらく元々はその名の通り、単にHTTPのための日付フォーマットを扱うモジュールだったのでしょうが、徐々に拡張が継ぎ足されてこのようなモジュールになったのだと想像されます。

で、これをGoに移植しました。以下のように使います。

import "github.com/Songmu/go-httpdate"

t1, _ := httpdate.Str2Time("2017-11-11", nil)
t2, _ := httpdate.Str2Time("Thu, 03 Feb 1994 12:33:44 GMT", nil)
t3, _ := httpdate.Str2Time("Thu Nov  9 18:20:31 GMT 2017", nil)
t4, _ := httpdate.Str2Time("08-Feb-94 14:15:29 GMT", nil)

文字列をよしなにパースして、 time.Time を返してくれます。非常に便利。対応フォーマットは以下のようになっています。HTTP::Dateがそうなっているので仕方ないのですが、もはやHTTPとは何なのか…、という気持ちになりますね。

  • "Wed, 09 Feb 1994 22:23:32 GMT" -- HTTP format
  • "Thu Feb 3 17:03:55 GMT 1994" -- ctime(3) format
  • "Thu Feb 3 00:00:00 1994", -- ANSI C asctime() format
  • "Tuesday, 08-Feb-94 14:15:29 GMT" -- old rfc850 HTTP format
  • "Tuesday, 08-Feb-1994 14:15:29 GMT" -- broken rfc850 HTTP format
  • "03/Feb/1994:17:03:55 -0700" -- common logfile format
  • "09 Feb 1994 22:23:32 GMT" -- HTTP format (no weekday)
  • "08-Feb-94 14:15:29 GMT" -- rfc850 format (no weekday)
  • "08-Feb-1994 14:15:29 GMT" -- broken rfc850 format (no weekday)
  • "1994-02-03 14:15:29 -0100" -- ISO 8601 format
  • "1994-02-03 14:15:29" -- zone is optional
  • "1994-02-03" -- only date
  • "1994-02-03T14:15:29" -- Use T as separator
  • "19940203T141529Z" -- ISO 8601 compact format
  • "19940203" -- only date
  • "08-Feb-94" -- old rfc850 HTTP format (no weekday, no time)
  • "08-Feb-1994" -- broken rfc850 HTTP format (no weekday, no time)
  • "09 Feb 1994" -- proposed new HTTP format (no weekday, no time)
  • "03/Feb/1994" -- common logfile format (no time, no offset)
  • "Feb 3 1994" -- Unix 'ls -l' format
  • "Feb 3 17:03" -- Unix 'ls -l' format
  • "11-15-96 03:52PM" -- Windows 'dir' format

ソースコードをご覧いただければわかりますが、愚直に移植したので、正規表現祭りとなっておりますので、パフォーマンスはお察しください。ちなみに計測すらしていません。とは言え実用上そこまで困ることもないはずです。

移植をしていて、Goは時刻を正確に扱うパッケージが標準ライブラリに存在するのは地味に大きな優位性だなーとか思ったりしました。

結構便利だと思うのでお試しください。

created at
last modified at