--- /dev/null
+<?php
+
+final class IPF_Format
+{
+ const DATE_BIG_ENDIAN = 0;
+ const DATE_LITTLE_ENDIAN = 4;
+ const DATE_MIDDLE_ENDIAN = 8;
+
+ const DATE_SLASHES = 0;
+ const DATE_DOTS = 1;
+ const DATE_HYPHENS = 2;
+ const DATE_SPACES = 3;
+
+ const DATE_ISO8601 = 2; // DATE_BIG_ENDIAN | DATE_HYPHENS
+ const DATE_US = 8; // DATE_MIDDLE_ENDIAN | DATE_SLASHES
+ const DATE_EUROPEAN = 5; // DATE_LITTLE_ENDIAN | DATE_DOTS
+
+ public static $dateSeparators;
+
+ public static function init()
+ {
+ self::$dateSeparators = array('/', '.', '-', ' ');
+ }
+
+ public static function flagsFromString($str)
+ {
+ $str = strtolower($str);
+ switch ($str) {
+ case 'iso8601':
+ return self::DATE_ISO8601;
+ case 'us':
+ return self::DATE_US;
+ case 'european':
+ return self::DATE_EUROPEAN;
+ default:
+ $a = explode(' with ', $str, 2);
+ $result = 0;
+ switch ($a[0]) {
+ case 'big-endian':
+ $result |= self::DATE_BIG_ENDIAN;
+ break;
+ case 'little-endian':
+ $result |= self::DATE_LITTLE_ENDIAN;
+ break;
+ case 'middle-endian':
+ $result |= self::DATE_MIDDLE_ENDIAN;
+ break;
+ default:
+ throw new IPF_Exception('Bad date endianess');
+ }
+ switch ($a[1]) {
+ case 'slashes':
+ $result |= self::DATE_SLASHES;
+ break;
+ case 'dots':
+ $result |= self::DATE_DOTS;
+ break;
+ case 'hyphens':
+ $result |= self::DATE_HYPHENS;
+ break;
+ case 'spaces':
+ $result |= self::DATE_SPACES;
+ break;
+ default:
+ throw new IPF_Exception('Bad date separator');
+ }
+ return $result;
+ }
+ }
+
+ public static function formatFor_date($flags)
+ {
+ return self::makeFormat($flags, array('Y', 'm', 'd'));
+ }
+
+ public static function formatFor_strftime($flags)
+ {
+ return self::makeFormat($flags, array('%Y', '%m', '%d'));
+ }
+
+ public static function makeFormat($flags, $chars)
+ {
+ $separator = self::$dateSeparators[$flags % 4];
+ switch ($flags & 12) {
+ case self::DATE_BIG_ENDIAN:
+ return $chars[0].$separator.$chars[1].$separator.$chars[2];
+ case self::DATE_LITTLE_ENDIAN:
+ return $chars[2].$separator.$chars[1].$separator.$chars[0];
+ case self::DATE_MIDDLE_ENDIAN:
+ return $chars[1].$separator.$chars[2].$separator.$chars[0];
+ default:
+ throw new IPF_Exception('Bad date format');
+ }
+ }
+
+ public static function parseDate($format, $str)
+ {
+ return strptime($str, self::formatFor_strftime($format));
+ }
+
+ public static function formatDate($format, $timestamp)
+ {
+ return strftime(self::formatFor_strftime($format), $timestamp);
+ }
+}
+
+IPF_Format::init();
+
--- /dev/null
+<?php
+
+class Format_Test extends PHPUnit_Framework_TestCase
+{
+ public function testFlags()
+ {
+ $this->assertEquals(IPF_Format::DATE_ISO8601, IPF_Format::DATE_BIG_ENDIAN | IPF_Format::DATE_HYPHENS);
+ $this->assertEquals(IPF_Format::DATE_US, IPF_Format::DATE_MIDDLE_ENDIAN | IPF_Format::DATE_SLASHES);
+ $this->assertEquals(IPF_Format::DATE_EUROPEAN, IPF_Format::DATE_LITTLE_ENDIAN | IPF_Format::DATE_DOTS);
+ }
+
+ public function testFlagsFromString()
+ {
+ $this->assertEquals(IPF_Format::DATE_ISO8601, IPF_Format::flagsFromString('iso8601'));
+ $this->assertEquals(IPF_Format::DATE_ISO8601, IPF_Format::flagsFromString('Big-endian with hyphEns'));
+ $this->assertEquals(IPF_Format::DATE_EUROPEAN, IPF_Format::flagsFromString('European'));
+ $this->assertEquals(IPF_Format::DATE_EUROPEAN, IPF_Format::flagsFromString('little-endian with dots'));
+ $this->assertEquals(IPF_Format::DATE_US, IPF_Format::flagsFromString('US'));
+ $this->assertEquals(IPF_Format::DATE_US, IPF_Format::flagsFromString('Middle-Endian With Slashes'));
+ $this->assertEquals(IPF_Format::DATE_BIG_ENDIAN | IPF_Format::DATE_SPACES,
+ IPF_Format::flagsFromString('big-endian with spaces'));
+ }
+}
+