Go to the documentation of this file.00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00015 final class DateRangeList extends BasePrimitive implements Stringable
00016 {
00017 protected $value = array();
00018
00022 public function clean()
00023 {
00024 parent::clean();
00025
00026 $this->value = array();
00027
00028 return $this;
00029 }
00030
00031 public function import($scope)
00032 {
00033 if (
00034 empty($scope[$this->name])
00035 || !is_array($scope[$this->name])
00036 || (
00037 count($scope[$this->name]) == 1
00038 && !current($scope[$this->name])
00039 )
00040 )
00041 return null;
00042
00043 $this->raw = $scope[$this->name];
00044 $this->imported = true;
00045 $list = array();
00046
00047 foreach ($this->raw as $string) {
00048 $rangeList = self::stringToDateRangeList($string);
00049
00050 if ($rangeList)
00051 foreach ($rangeList as $range)
00052 $list[] = $range;
00053 }
00054
00055 $this->value = $list;
00056
00057 return ($this->value !== array());
00058 }
00059
00060 public function toString()
00061 {
00062 if ($this->value) {
00063 $out = array();
00064
00065 foreach ($this->value as $range)
00066 $out[] = $range->toDateString();
00067
00068 return implode(', ', $out);
00069 }
00070
00071 return null;
00072 }
00073
00074 public static function stringToDateRangeList($string)
00075 {
00076 $list = array();
00077
00078 if ($string) {
00079 if (strpos($string, ',') !== false)
00080 $dates = explode(',', $string);
00081 else
00082 $dates = array($string);
00083
00084 foreach ($dates as $date) {
00085 try {
00086 $list[] = self::makeRange($date);
00087 } catch (WrongArgumentException $e) {
00088
00089 }
00090 }
00091 }
00092
00093 return $list;
00094 }
00095
00100 public static function makeRange($string)
00101 {
00102 if (
00103 (substr_count($string, ' - ') === 1)
00104 || (substr_count($string, '-') === 1)
00105 ) {
00106 $delimiter = ' - ';
00107
00108 if (substr_count($string, '-') === 1)
00109 $delimiter = '-';
00110
00111 list($start, $finish) = explode($delimiter, $string, 2);
00112
00113 $start = self::toDate(trim($start));
00114 $finish = self::toDate(trim($finish));
00115
00116 if ($start || $finish) {
00117
00118 $range = new DateRange();
00119
00120 $range =
00121 DateRange::create()->
00122 lazySet($start, $finish);
00123
00124 return $range;
00125
00126 } elseif (trim($string) == '-')
00127 return DateRange::create();
00128 } elseif ($single = self::toDate(trim($string)))
00129 return
00130 DateRange::create()->
00131 setStart($single)->
00132 setEnd($single);
00133
00134 throw new WrongArgumentException(
00135 "unknown string format '{$string}'"
00136 );
00137 }
00138
00143 private static function toDate($date)
00144 {
00145 if (strpos($date, '.') !== false) {
00146
00147 $fieldCount = substr_count($date, '.') + 1;
00148
00149 $year = null;
00150
00151 if ($fieldCount == 3) {
00152 list($day, $month, $year) = explode('.', $date, $fieldCount);
00153
00154 if (strlen($day) > 2) {
00155 $tmp = $year;
00156 $year = $day;
00157 $day = $tmp;
00158 }
00159 } else
00160 list($day, $month) = explode('.', $date, $fieldCount);
00161
00162 if (strlen($day) == 1)
00163 $day = "0{$day}";
00164
00165 if ($month === null)
00166 $month = date('m');
00167 elseif (strlen($month) == 1)
00168 $month = "0{$month}";
00169
00170 $currentYear = date('Y');
00171 if ($year === null)
00172 $year = $currentYear;
00173 elseif (strlen($year) === 2)
00174 $year = substr_replace($currentYear, $year, -2, 2);
00175
00176 $date = $year.$month.$day;
00177 }
00178
00179 $lenght = strlen($date);
00180
00181 if ($lenght > 4) {
00182 return new Date(strtotime($date));
00183 } elseif ($lenght === 4) {
00184 return new Date(
00185 strtotime(
00186 date('Y-').substr($date, 2).'-'.substr($date, 0, 2)
00187 )
00188 );
00189 } elseif (($lenght == 2) || ($lenght == 1)) {
00190 return new Date(strtotime(date('Y-m-').$date));
00191 }
00192
00193 return null;
00194 }
00195
00196 public function exportValue()
00197 {
00198
00199 throw new UnimplementedFeatureException();
00200 }
00201 }
00202 ?>