Overview

Namespaces

  • Apptus
    • ESales
      • Connector
        • Report
        • Time
    • Util
      • Cache
  • PHP
  • Overview
  • Namespace
  • Class
  • Tree
  1:   2:   3:   4:   5:   6:   7:   8:   9:  10:  11:  12:  13:  14:  15:  16:  17:  18:  19:  20:  21:  22:  23:  24:  25:  26:  27:  28:  29:  30:  31:  32:  33:  34:  35:  36:  37:  38:  39:  40:  41:  42:  43:  44:  45:  46:  47:  48:  49:  50:  51:  52:  53:  54:  55:  56:  57:  58:  59:  60:  61:  62:  63:  64:  65:  66:  67:  68:  69:  70:  71:  72:  73:  74:  75:  76:  77:  78:  79:  80:  81:  82:  83:  84:  85:  86:  87:  88:  89:  90:  91:  92:  93:  94:  95:  96:  97:  98:  99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 
<?php
namespace Apptus\ESales\Connector\Time;

/**
 * A date on the form YYYY-MM-DD according to the Gregorian calendar.
 *
 * This class describes a calendar date as defined by ISO 8601.
 */
class CalendarDate extends IsoDate {
    /** @internal */
    const ABSOLUTE_PATTERN = '/^([0-9][0-9][0-9][0-9])((-?)([0-1][0-9])((-?)([0-3][0-9]))?)?$/';
    /** @internal */
    const RELATIVE_DAY_PATTERN = '/^((([0-9][0-9][0-9][0-9])(-?))?([0-1][0-9])(-?))?([0-3][0-9])$/';
    /** @internal */
    const RELATIVE_MONTH_PATTERN = '/^(([0-9][0-9][0-9][0-9])(-?))?([0-1][0-9])$/';
    /** @internal */
    const RELATIVE_YEAR_PATTERN = '/^([0-9][0-9][0-9][0-9])$/';

    /**
     * Parses the input and, if parsing succeeds, returns a calendar date.
     * Otherwise returns null.
     *
     * @internal
     * @param string
     *          A date string in the ISO 8601 calendar date format YYYY-MM-DD or YYYYMMDD, where month and day may be omitted.
     * @return CalendarDate A calendar date representing the parsed date, or null if parsing failed.
    */
    public static function tryParseAbsolute($input) {
        $matches = array();
        $m = preg_match(self::ABSOLUTE_PATTERN, $input, $matches);

        if ($m === 1) {
            $year = (int) $matches[1];
            $month = empty($matches[4]) ? null : Month::validate((int) $matches[4]);
            $day = empty($matches[7]) ? null : (int) $matches[7];
            return new CalendarDate($year, $month, $day);
        }

        return null;
    }

    /**
     * Parses the input and, if parsing succeeds, returns a calendar date.
     * Otherwise returns null.
     *
     * The date may omit the year or the year and month, which in such case will be
     * inherited from the start date supplied.
     *
     * @static
     * @internal
     * @param string
     *          A date string in the ISO 8601 calendar date format YYYY-MM-DD or YYYYMMDD, where month and day may be omitted.
     * @param CalendarDate $start
     * @return CalendarDate|null A calendar date representing the parsed date, or null if parsing failed.
     */
    public static function tryParseRelative($input, CalendarDate $start) {
        if ($start->day() !== null) {
            $matches = array ();
            $m = preg_match(self::RELATIVE_DAY_PATTERN, $input, $matches);

            if ($m === 1) {
                $year = empty($matches[3]) ? $start->year() : (int) $matches[3];
                $month = empty($matches[5]) ? $start->month() : Month::validate((int) $matches[5]);
                $day = (int) $matches[7];
                return new CalendarDate($year, $month, $day);
            }
        } elseif ($start->month() !== null) {
            $matches = array ();
            $m = preg_match(self::RELATIVE_MONTH_PATTERN, $input, $matches);

            if ($m === 1) {
                $year = empty($matches[2]) ? $start->year() : (int) $matches[2];
                $month = Month::validate((int) $matches[4]);
                return new CalendarDate($year, $month, null);
            }
        } else {
            $matches = array ();
            $m = preg_match(self::RELATIVE_YEAR_PATTERN, $input, $matches);

            if ($m === 1) {
                $year = (int) $matches[1];
                return new CalendarDate($year, null, null);
            }
        }

        return null;
    }

    private $year;
    private $month;
    private $day;

    /**
     * Creates a new calendar date with the specified year, month and day.
     *
     * The day or the day and month may be omitted for less precision.
     *
     * @param int
     *          The year, e.g. 2001.
     * @param int|null
     *          The month, e.g. Month::JANUARY, or null.
     * @param int|null
     *          The day in month, e.g. 4.
     * @throws \InvalidArgumentException
     */
    public function __construct($year, $month, $day) {
        if ($year === null) {
            throw new \InvalidArgumentException('Year may not be null.');
        }

        if ($month !== null) {
            $month = Month::validate($month);
        }

        if ($day !== null && $month === null) {
            throw new \InvalidArgumentException('Month may not be null when day is non-null.');
        }

        if ($day !== null && ($day < 1 || $day > 31)) {
            throw new \InvalidArgumentException('Day must be in the range 1-31.');
        }

        $this->year = $year;
        $this->month = $month;
        $this->day = $day;
    }

    /**
     * Returns the year. Never returns null.
     *
     * @return int
     */
    public function year() {
        return $this->year;
    }

    /**
     * Returns the month, if specified at creation. Otherwise returns null.
     *
     * @return int|null
     */
    public function month() {
        return $this->month;
    }

    /**
     * Returns the day in month, if specified at creation. Otherwise returns null.
     *
     * @return int|null
     */
    public function day() {
        return $this->day;
    }

    public function hasDayPrecision() {
        return $this->day !== null;
    }

    public function __toString() {
        $result = sprintf('%04d', $this->year);

        if ($this->month !== null) {
            $result .= sprintf('-%02d', $this->month);

            if ($this->day !== null) {
                $result .= sprintf('-%02d', $this->day);
            }
        }

        return $result;
    }

    public function toTimePoint(Time $t = null, \DateTimeZone $tz) {
        if ($t === null) {
            $t = new Time(0, null, null, null);
        }

        $year = $this->year;
        $month = $this->month !== null ? $this->month : Month::JANUARY;
        $day = $this->day !== null ? $this->day : 1;
        $hour = $t->hour();
        $minute = $t->minute() !== null ? $t->minute() : 0;
        $second = $t->second() !== null ? $t->second() : 0;

        if ($t->offset() !== null) {
            $tz = new \DateTimeZone('UTC');
        }
        $dt = new \DateTime(null, $tz);
        $dt->setDate($year, $month, $day);
        $dt->setTime($hour, $minute, $second);
        $offset = $t->offset();
        if ($offset !== null) {
            if ($offset < 0) {
                $dt->add(new \DateInterval('PT' . -$offset . 'M'));
            } else {
                $dt->sub(new \DateInterval('PT' . $offset . 'M'));
            }
        }
        return TimePoint::fromDateTime($dt);
    }

    public function equals($o) {
        if ($this === $o) return true;
        if ($o === null || gettype($o) !== 'object' || get_class($this) !== get_class($o)) return false;

        $that = $o;

        if ($this->day !== null ? ($this->day !== $that->day) : ($that->day !== null)) return false;
        if ($this->month !== null ? ($this->month !== $that->month) : ($that->month !== null)) return false;
        if ($this->year !== null ? ($this->year !== $that->year) : ($that->year !== null)) return false;

        return true;
    }
}
Apptus ESales Connector PHP API documentation generated by ApiGen