]> git.andy128k.dev Git - ipf.git/commitdiff
date format utilities
authorAndrey Kutejko <andy128k@gmail.com>
Sat, 10 Aug 2013 13:58:29 +0000 (16:58 +0300)
committerAndrey Kutejko <andy128k@gmail.com>
Sat, 10 Aug 2013 13:58:29 +0000 (16:58 +0300)
ipf/format.php [new file with mode: 0644]
t/FormatTest.php [new file with mode: 0644]

diff --git a/ipf/format.php b/ipf/format.php
new file mode 100644 (file)
index 0000000..77c5041
--- /dev/null
@@ -0,0 +1,108 @@
+<?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();
+
diff --git a/t/FormatTest.php b/t/FormatTest.php
new file mode 100644 (file)
index 0000000..6dfd746
--- /dev/null
@@ -0,0 +1,24 @@
+<?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'));
+    }
+}
+