43 const DATETIME_FORMAT_DATE_WIDTH =
'short';
45 const DATETIME_FORMAT_TIME_WIDTH =
'short';
47 const DISPLAY_FORMAT_FOR_INPUT =
'Display Format For Input';
49 const DISPLAY_FORMAT_ABBREVIATED_MONTH_ONLY_WIDTH =
'Display Format Abbreviated Month';
51 const DISPLAY_FORMAT_ABBREVIATED_MONTH_AND_DAY_WIDTH =
'Display Format Abbreviated Month And Day';
61 assert(
'DateTimeUtil::isValidDbFormattedDateTime($dateTime)');
62 $nowTimeStamp = time();
63 $dateTimeStamp = DateTimeUtil::convertDbFormatDateTimeToTimeStamp($dateTime);
64 $timeSinceLatestUpdate = $nowTimeStamp - $dateTimeStamp;
65 $timeForString = array(
66 'days' => floor($timeSinceLatestUpdate / 86400),
67 'hours' => floor($timeSinceLatestUpdate / 3600),
68 'minutes' => floor($timeSinceLatestUpdate / (60)),
69 'seconds' => floor($timeSinceLatestUpdate)
72 if ($timeForString[
'days'] >= 1)
74 if ($durationDisplayFormat ===
true)
76 return Zurmo::t(
'Core',
'{n} day|{n} days', $timeForString[
'days']);
80 return Zurmo::t(
'Core',
'{n} day ago|{n} days ago', $timeForString[
'days']);
85 if ($timeForString[
'hours'] >= 1)
87 if ($durationDisplayFormat ===
true)
89 return Zurmo::t(
'Core',
'{n} hour|{n} hours', $timeForString[
'hours']);
93 return Zurmo::t(
'Core',
'{n} hour ago|{n} hours ago', $timeForString[
'hours']);
98 if ($timeForString[
'minutes'] >= 1)
100 if ($durationDisplayFormat ===
true)
102 return Zurmo::t(
'Core',
'{n} minute|{n} minutes', $timeForString[
'minutes']);
106 return Zurmo::t(
'Core',
'{n} minute ago|{n} minutes ago', $timeForString[
'minutes']);
111 if ($durationDisplayFormat ===
true)
113 return Zurmo::t(
'Core',
'{n} second|{n} seconds', $timeForString[
'seconds']);
117 return Zurmo::t(
'Core',
'{n} second ago|{n} seconds ago', $timeForString[
'seconds']);
131 assert(
'DateTimeUtil::isValidDbFormattedDateTime($dateTime)');
132 $nowTimeStamp = time();
133 $dateTimeStamp = DateTimeUtil::convertDbFormatDateTimeToTimeStamp($dateTime);
134 $timeSince = $nowTimeStamp - $dateTimeStamp;
135 return floor($timeSince / 86400);
147 return Yii::app()->locale->getMonthName((
int)$month);
158 $dateTimePattern = Yii::app()->locale->getDateTimeFormat();
159 $timeFormat = Yii::app()->locale->getTimeFormat(self::DATETIME_FORMAT_TIME_WIDTH);
160 $dateFormat = Yii::app()->locale->getDateFormat(self::DATETIME_FORMAT_DATE_WIDTH);
161 return strtr($dateTimePattern, array(
'{0}' => $timeFormat,
'{1}' => $dateFormat));
164 public static function getLocaleDateTimeFormatForInput()
166 $dateTimePattern = Yii::app()->locale->getDateTimeFormat();
167 $timeFormat = Yii::app()->locale->getTimeFormat(self::DATETIME_FORMAT_TIME_WIDTH);
168 $dateFormat = Yii::app()->locale->getDateFormatForInput(self::DATETIME_FORMAT_DATE_WIDTH);
169 return strtr($dateTimePattern, array(
'{0}' => $timeFormat,
'{1}' => $dateFormat));
172 public static function getLocaleDateFormat($dateWidth = self::DATETIME_FORMAT_DATE_WIDTH)
174 return Yii::app()->locale->getDateFormat($dateWidth);
177 public static function getLocaleDateFormatForInput($dateWidth = self::DATETIME_FORMAT_DATE_WIDTH)
179 return Yii::app()->locale->getDateFormatForInput($dateWidth);
182 public static function getLocaleTimeFormat($timeWidth = self::DATETIME_FORMAT_TIME_WIDTH)
184 return Yii::app()->locale->getTimeFormat($timeWidth);
187 public static function isLocaleTimeDisplayedAs12Hours()
189 $timeFormat = DateTimeUtil::getLocaleTimeFormat();
190 if (strpos($timeFormat,
'H') ===
false)
197 public static function resolveTimeStampForDateTimeLocaleFormattedDisplay($value,
198 $dateWidth = self::DATETIME_FORMAT_DATE_WIDTH,
199 $timeWidth = self::DATETIME_FORMAT_TIME_WIDTH,
208 $pattern = static::getLocaleDateTimeFormatForInput();
209 return Yii::app()->dateFormatter->format($pattern, $value);
211 return Yii::app()->dateFormatter->formatDateTime($value, $dateWidth, $timeWidth);
222 $date, $displayFormat = null)
229 if ($parsedTimeStamp ===
false)
233 if ($displayFormat == self::DISPLAY_FORMAT_ABBREVIATED_MONTH_ONLY_WIDTH)
235 $month = Yii::app()->dateFormatter->format(
'M', $parsedTimeStamp);
236 return Yii::app()->locale->getMonthName($month,
'abbreviated',
true);
238 elseif ($displayFormat == self::DISPLAY_FORMAT_ABBREVIATED_MONTH_AND_DAY_WIDTH)
240 $month = Yii::app()->dateFormatter->format(
'M', $parsedTimeStamp);
241 $content = Yii::app()->locale->getMonthName($month,
'abbreviated',
true);
242 $content .=
' ' . Yii::app()->dateFormatter->format(
'd', $parsedTimeStamp);
245 elseif ($displayFormat == static::DISPLAY_FORMAT_FOR_INPUT)
247 return Yii::app()->dateFormatter->format(static::getLocaleDateFormatForInput(self::DATETIME_FORMAT_DATE_WIDTH), $parsedTimeStamp);
249 return Yii::app()->dateFormatter->format(static::getLocaleDateFormat(self::DATETIME_FORMAT_DATE_WIDTH), $parsedTimeStamp);
252 public static function resolveValueForDateDBFormatted($value)
258 $localeDateFormat = DateTimeUtil::getLocaleDateFormatForInput();
260 CDateTimeParser::parse($value, $localeDateFormat));
268 assert(
'is_string($timeZone)');
269 $timeZoneObject =
new DateTimeZone($timeZone);
270 $offset = $timeZoneObject->getOffset(
new DateTime());
271 return $utcTimeStamp + $offset;
279 assert(
'is_string($timeZone)');
280 $timeZoneObject =
new DateTimeZone($timeZone);
281 $offset = $timeZoneObject->getOffset(
new DateTime());
282 return $utcTimeStamp - $offset;
285 public static function convertTimestampToDbFormatDate($timestamp)
287 assert(
'is_int($timestamp)');
288 $timeZone = date_default_timezone_get();
289 date_default_timezone_set(
'GMT');
292 date_default_timezone_set($timeZone);
296 public static function convertTimestampToDbFormatDateTime($timestamp)
298 assert(
'is_int($timestamp)');
299 $timeZone = date_default_timezone_get();
300 date_default_timezone_set(
'GMT');
303 date_default_timezone_set($timeZone);
307 public static function convertDbFormatDateTimeToTimestamp($dbFormatDateTime)
309 assert(
'is_string($dbFormatDateTime)');
310 $timeZone = date_default_timezone_get();
311 date_default_timezone_set(
'GMT');
312 $result = strtotime($dbFormatDateTime);
313 date_default_timezone_set($timeZone);
317 public static function convertTimestampToDisplayFormat($timestamp,
318 $dateWidth = self::DATETIME_FORMAT_DATE_WIDTH,
319 $timeWidth = self::DATETIME_FORMAT_TIME_WIDTH,
322 assert(
'is_int($timestamp)');
323 return self::resolveTimeStampForDateTimeLocaleFormattedDisplay($timestamp, $dateWidth, $timeWidth, $forInput);
326 public static function isValidDbFormattedDate($date)
328 if ($date ==
'0000-00-00')
332 return preg_match(
'/^[1-2][0-9][0-9][0-9]-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|[3][0-1])$/',
336 public static function isValidDbFormattedDateTime($datetime)
338 if ($datetime ==
'0000-00-00 00:00:00')
342 return preg_match(
'/^[1-2][0-9][0-9][0-9]-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|[3][0-1]) ' .
343 '(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$/',
347 public static function convertDbFormattedDateTimeToLocaleFormattedDisplay($dbFormatDateTime,
348 $dateWidth = self::DATETIME_FORMAT_DATE_WIDTH,
349 $timeWidth = self::DATETIME_FORMAT_TIME_WIDTH,
352 assert(
'is_string($dbFormatDateTime) || $dbFormatDateTime == null');
353 if ($dbFormatDateTime == null || $dbFormatDateTime ==
'0000-00-00 00:00:00')
357 $timestamp = self::convertDbFormatDateTimeToTimestamp($dbFormatDateTime);
358 return self::convertTimestampToDisplayFormat((
int)$timestamp, $dateWidth, $timeWidth, $forInput);
368 assert(
'is_string($localeFormattedDateTime) || $localeFormattedDateTime == null');
369 if ($localeFormattedDateTime == null)
373 $timestamp = CDateTimeParser::parse($localeFormattedDateTime, self::getLocaleDateTimeFormatForInput());
374 if ($timestamp == null)
378 $dbFormattedDateTime = self::convertTimestampToDbFormatDateTime($timestamp);
380 return substr_replace($dbFormattedDateTime,
'00', -2, 2);
392 assert(
'is_string($dateValue) && DateTimeUtil::isValidDbFormattedDate($dateValue)');
393 $greaterThanValue = $dateValue .
' 00:00:00';
394 return static::convertDbFormattedDateTimeToTimeZoneAdjustedDateTime($greaterThanValue);
407 assert(
'is_string($dateValue) && DateTimeUtil::isValidDbFormattedDate($dateValue)');
408 $lessThanValue = $dateValue .
' 23:59:59';
409 return static::convertDbFormattedDateTimeToTimeZoneAdjustedDateTime($lessThanValue);
418 assert(
'is_string($dateTime) && DateTimeUtil::isValidDbFormattedDateTime($dateTime)');
419 $userTimeZone =
new DateTimeZone(Yii::app()->timeZoneHelper->getForCurrentUser());
420 $adjustedDate =
new DateTime($dateTime, $userTimeZone);
421 $adjustedDate->setTimezone(
new DateTimeZone(
'GMT'));
422 $adjustedTimeStamp = $adjustedDate->getTimestamp();
423 return static::convertTimestampToDbFormatDateTime($adjustedTimeStamp);
426 public static function getFirstDayOfAMonthDate($stringTime = null)
428 assert(
'is_string($stringTime) || $stringTime == null');
429 $dateTime =
new DateTime($stringTime);
430 $dateTime->modify(
'first day of this month');
432 $dateTime->getTimestamp());
435 public static function getLastDayOfAMonthDate($stringTime = null)
437 assert(
'is_string($stringTime) || $stringTime == null');
438 $dateTime =
new DateTime($stringTime);
439 $dateTime->modify(
'last day of this month');
441 $dateTime->getTimestamp());
444 public static function getFirstDayOfLastMonthDate($stringTime = null)
446 assert(
'is_string($stringTime) || $stringTime == null');
447 $dateTime =
new DateTime($stringTime);
448 $dateTime->modify(
'first day of last month');
450 $dateTime->getTimestamp());
453 public static function getLastDayOfLastMonthDate($stringTime = null)
455 assert(
'is_string($stringTime) || $stringTime == null');
456 $dateTime =
new DateTime($stringTime);
457 $dateTime->modify(
'last day of last month');
459 $dateTime->getTimestamp());
462 public static function getFirstDayOfNextMonthDate($stringTime = null)
464 assert(
'is_string($stringTime) || $stringTime == null');
465 $dateTime =
new DateTime($stringTime);
466 $dateTime->modify(
'first day of next month');
468 $dateTime->getTimestamp());
471 public static function getLastDayOfNextMonthDate($stringTime = null)
473 assert(
'is_string($stringTime) || $stringTime == null');
474 $dateTime =
new DateTime($stringTime);
475 $dateTime->modify(
'last day of next month');
477 $dateTime->getTimestamp());
480 public static function isDateValueNull(
RedBeanModel $model, $attributeName)
482 assert(
'is_string($attributeName) || $attributeName == null');
483 return self::isDateStringNull($model->$attributeName);
486 public static function isDateStringNull($date)
488 assert(
'is_string($date) || $date == null');
489 if ($date != null && $date !=
'0000-00-00')
496 public static function isDateTimeValueNull(
RedBeanModel $model, $attributeName)
498 assert(
'is_string($attributeName) || $attributeName == null');
499 return self::isDateTimeStringNull($model->$attributeName);
502 public static function isDateTimeStringNull($dateTime)
504 assert(
'is_string($dateTime) || $dateTime == null');
505 if ($dateTime != null && $dateTime !=
'0000-00-00 00:00:00')
512 public static function resolveDateAsDateTime($date)
514 assert(
'is_string($date)');
515 return $date .
' 00:00:00';
518 public static function resolveDateTimeAsDate($dateTime)
520 assert(
'is_string($dateTime)');
521 if ($dateTime ==
'0000-00-00 00:00:00')
525 elseif ($dateTime == null)
529 return substr($dateTime, 0, 10);
540 assert(
'is_string($beginDate)');
541 assert(
'is_string($endDate)');
542 $beginTimeStamp = strtotime($beginDate);
543 $endTimeStamp = strtotime($endDate);
544 $quantityOfDays = round(($endTimeStamp - $beginTimeStamp) / 86400) + 1;
546 for ($i = 0; $i < $quantityOfDays; $i++)
548 $daysData[] = date(
'Y-m-d', ($beginTimeStamp + ($i * 86400)));
562 assert(
'is_string($beginDate)');
563 assert(
'is_string($endDate)');
564 $weekTimeStamp = strtotime($beginDate);
565 $endTimeStamp = strtotime($endDate);
566 $weeksData = array();
567 while ($weekTimeStamp <= $endTimeStamp)
569 $date =
new DateTime(date(
'Y-m-d', $weekTimeStamp));
570 if ((
'Sunday' == $date->format(
'l')) && !static::doesWeekStrictlyStartOnMonday())
572 $date->modify(
'Monday last week');
576 $date->modify(
'Monday this week');
578 $beginDateOfWeek = $date->format(
'Y-m-d');
579 $date->modify(
'this week next sunday');
580 $endDateOfWeek = $date->format(
'Y-m-d');
581 $weeksData[$beginDateOfWeek] = $endDateOfWeek;
582 $weekTimeStamp = strtotime(
"+1 week", $weekTimeStamp);
585 $date =
new DateTime(date(
'Y-m-d', $weekTimeStamp));
586 if ((
'Sunday' == $date->format(
'l')) && !static::doesWeekStrictlyStartOnMonday())
588 $date->modify(
'Monday last week');
592 $date->modify(
'Monday this week');
594 $beginDateOfWeek = $date->format(
'Y-m-d');
595 if ($beginDateOfWeek < $endDate)
597 $date->modify(
'this week next sunday');
598 $endDateOfWeek = $date->format(
'Y-m-d');
599 $weeksData[$beginDateOfWeek] = $endDateOfWeek;
600 $weekTimeStamp = strtotime(
"+1 week", $weekTimeStamp);
602 if ($endDateOfWeek < $endDate)
604 $date =
new DateTime(date(
'Y-m-d', $weekTimeStamp));
605 if ((
'Sunday' == $date->format(
'l')) && !static::doesWeekStrictlyStartOnMonday())
607 $date->modify(
'Monday last week');
611 $date->modify(
'Monday this week');
613 $beginDateOfWeek = $date->format(
'Y-m-d');
614 $date->modify(
'this week next sunday');
615 $endDateOfWeek = $date->format(
'Y-m-d');
616 $weeksData[$beginDateOfWeek] = $endDateOfWeek;
630 assert(
'is_string($beginDate)');
631 assert(
'is_string($endDate)');
632 $monthTimeStamp = strtotime($beginDate);
633 $endTimeStamp = strtotime($endDate);
634 $monthsData = array();
635 while ($monthTimeStamp <= $endTimeStamp)
637 $date =
new DateTime(date(
'Y-m-d', $monthTimeStamp));
638 $date->modify(
'first day of this month');
639 $beginDateOfMonth = $date->format(
'Y-m-d');
640 $date->modify(
'last day of this month');
641 $endDateOfMonth = $date->format(
'Y-m-d');
642 $monthsData[$beginDateOfMonth] = $endDateOfMonth;
643 $monthTimeStamp = strtotime(
"+1 month", $monthTimeStamp);
646 $date =
new DateTime(date(
'Y-m-d', $monthTimeStamp));
647 $date->modify(
'first day of this month');
648 $beginDateOfMonth = $date->format(
'Y-m-d');
649 if ($beginDateOfMonth < $endDate)
651 $date->modify(
'last day of this month');
652 $endDateOfMonth = $date->format(
'Y-m-d');
653 $monthsData[$beginDateOfMonth] = $endDateOfMonth;
654 $monthTimeStamp = strtotime(
"+1 month", $monthTimeStamp);
656 if ($endDateOfMonth < $endDate)
658 $date =
new DateTime(date(
'Y-m-d', $monthTimeStamp));
659 $date->modify(
'first day of this month');
660 $beginDateOfMonth = $date->format(
'Y-m-d');
661 $date->modify(
'last day of this month');
662 $endDateOfMonth = $date->format(
'Y-m-d');
663 $monthsData[$beginDateOfMonth] = $endDateOfMonth;
675 assert(
'is_string($stringTime) || $stringTime == null');
676 $dayOfTheWeek = date(
'w', strtotime($stringTime));
677 $dateTime =
new DateTime($stringTime);
678 $dateTime->modify(
'this week');
679 if ($dayOfTheWeek == 0 && !static::doesWeekStrictlyStartOnMonday())
681 $dateTime->modify(
'-7 days');
684 $dateTime->getTimestamp());
694 assert(
'is_string($stringTime) || $stringTime == null');
695 $dayOfTheWeek = date(
'w', strtotime($stringTime));
696 $dateTime =
new DateTime($stringTime);
697 $dateTime->modify(
'this week +6 days');
698 if ($dayOfTheWeek == 0 && !static::doesWeekStrictlyStartOnMonday())
700 $dateTime->modify(
'-7 days');
703 $dateTime->getTimestamp());
712 $dateTime =
new DateTime();
714 $dateTime->getTimestamp());
723 $dateTime =
new DateTime();
724 $dateTime->modify(
'next monday');
726 $dateTime->getTimestamp());
735 $dateTime =
new DateTime();
736 $dateTime->modify(
'tomorrow');
738 $dateTime->getTimestamp());
749 $absOffset = abs($offset);
750 $hours = floor($absOffset / (60 * 60));
751 $absOffset -= $hours * (60 * 60);
753 $minutes = floor($absOffset / 60);
754 $absOffset -= $minutes * 60;
756 $seconds = floor($absOffset);
757 $absOffset -= $seconds;
758 $hours = ($hours < 10)?
'0' . $hours : $hours;
759 $minutes = ($minutes < 10)?
'0' . $minutes : $minutes;
760 $seconds = ($seconds < 10)?
'0' . $seconds : $seconds;
761 return $date .
' ' . $hours .
':' . $minutes .
':' . $seconds;
773 $stringTime =
'2014-04-27 23:59:59';
774 $dateTime =
new DateTime($stringTime);
775 $dateTime->modify(
'this week');
776 if ($dateTime->format(
'Y-m-d') ==
'2014-04-21')
static getTomorrowsDate()
static convertFromLocalUnixStampByTimeZoneToUtcUnixStamp($utcTimeStamp, $timeZone)
static getFirstDayOfNextWeek()
static convertDateToDateTimeByTimeZoneOffset($date)
static getMonthName($month)
static getTimeSinceDisplayContent($dateTime, $durationDisplayFormat=false)
static convertDateTimeLocaleFormattedDisplayToDbFormattedDateTimeWithSecondsAsZero($localeFormattedDateTime)
static getLocaleDateTimeFormat()
static convertDateIntoTimeZoneAdjustedDateTimeBeginningOfDay($dateValue)
static getFirstDayOfAWeek($stringTime=null)
static getLastDayOfAWeek($stringTime=null)
static convertDbFormattedDateTimeToTimeZoneAdjustedDateTime($dateTime)
static getTimeSinceInDays($dateTime)
static resolveValueForDateLocaleFormattedDisplay($date, $displayFormat=null)
static getDateTimeFormat()
static getMonthStartAndEndDatesBetweenTwoDatesInARange($beginDate, $endDate)
static doesWeekStrictlyStartOnMonday()
static getDatesBetweenTwoDatesInARange($beginDate, $endDate)
static convertDateIntoTimeZoneAdjustedDateTimeEndOfDay($dateValue)
static getTimeZoneOffset()
static getWeekStartAndEndDatesBetweenTwoDatesInARange($beginDate, $endDate)
static convertFromUtcUnixStampByTimeZone($utcTimeStamp, $timeZone)