public function Validate() { if (!parent::Validate()) { return false; } if ($this->strText != '') { $dttDateTime = new QDateTime($this->strText); if ($dttDateTime->IsDateNull()) { $this->strValidationError = QApplication::Translate("invalid date"); return false; } if (!is_null($this->Minimum)) { if ($dttDateTime->IsEarlierThan($this->Minimum)) { $this->strValidationError = QApplication::Translate("date is earlier than minimum allowed"); return false; } } if (!is_null($this->Maximum)) { if ($dttDateTime->IsLaterThan($this->Maximum)) { $this->strValidationError = QApplication::Translate("date is later than maximum allowed"); return false; } } } $this->strValidationError = ''; return true; }
/** * Validate the control. * @return bool */ public function Validate() { if (!parent::Validate()) { return false; } if ($this->strText != '') { $dttDateTime = new QDateTime($this->strText, null, QDateTime::DateOnlyType); if ($dttDateTime->IsDateNull()) { $this->ValidationError = QApplication::Translate("Invalid date"); return false; } if (!is_null($this->Minimum)) { if ($dttDateTime->IsEarlierThan($this->Minimum)) { if ($this->strMinDateErrorMsg) { $this->ValidationError = $this->strMinDateErrorMsg; } else { $this->ValidationError = QApplication::Translate("Date is earlier than minimum allowed"); } return false; } } if (!is_null($this->Maximum)) { if ($dttDateTime->IsLaterThan($this->Maximum)) { if ($this->strMaxDateErrorMsg) { $this->ValidationError = $this->strMaxDateErrorMsg; } else { $this->ValidationError = QApplication::Translate("Date is later than maximum allowed"); } return false; } } } return true; }
public function testIncompleteDates() { $obj1 = new QDateTime("Feb 12"); $this->assertFalse($obj1->IsNull()); $this->assertFalse($obj1->IsDateNull()); $this->assertTrue($obj1->IsTimeNull()); $obj2 = new QDateTime("March 2003"); $this->assertFalse($obj2->IsNull()); $this->assertFalse($obj2->IsDateNull()); $this->assertTrue($obj2->IsTimeNull()); }
public static function ParseForDateTimeValue($strText) { // Trim and Clean $strText = strtolower(trim($strText)); while (strpos($strText, ' ') !== false) { $strText = str_replace(' ', ' ', $strText); } $strText = str_replace('.', '', $strText); $strText = str_replace('@', ' ', $strText); // Are we ATTEMPTING to parse a Time value? if (strpos($strText, ':') === false && strpos($strText, 'am') === false && strpos($strText, 'pm') === false) { // There is NO TIME VALUE $dttToReturn = new QDateTime($strText); if ($dttToReturn->IsDateNull()) { return null; } else { return $dttToReturn; } } // Add ':00' if it doesn't exist AND if 'am' or 'pm' exists if (strpos($strText, 'pm') !== false && strpos($strText, ':') === false) { $strText = str_replace(' pm', ':00 pm', $strText, $intCount); if (!$intCount) { $strText = str_replace('pm', ':00 pm', $strText, $intCount); } } else { if (strpos($strText, 'am') !== false && strpos($strText, ':') === false) { $strText = str_replace(' am', ':00 am', $strText, $intCount); if (!$intCount) { $strText = str_replace('am', ':00 am', $strText, $intCount); } } } $dttToReturn = new QDateTime($strText); if ($dttToReturn->IsDateNull()) { return null; } else { return $dttToReturn; } }
protected function GetControlHtml() { // Ignore Class $strCssClass = $this->strCssClass; $this->strCssClass = ''; $strAttributes = $this->GetAttributes(); $this->strCssClass = $strCssClass; $strStyle = $this->GetStyleAttributes(); if ($strStyle) { $strAttributes .= sprintf(' style="%s"', $strStyle); } $strCommand = sprintf(' onchange="Qcodo__DateTimePicker_Change(\'%s\', this);"', $this->strControlId); if ($this->dttDateTime) { $dttDateTime = $this->dttDateTime; } else { $dttDateTime = new QDateTime(); } $strToReturn = ''; // Generate Date-portion switch ($this->strDateTimePickerType) { case QDateTimePickerType::Date: case QDateTimePickerType::DateTime: case QDateTimePickerType::DateTimeSeconds: // Month $strMonthListbox = sprintf('<select name="%s_lstMonth" id="%s_lstMonth" class="month" %s%s>', $this->strControlId, $this->strControlId, $strAttributes, $strCommand); if (!$this->blnRequired || $dttDateTime->IsDateNull()) { $strMonthListbox .= '<option value="">--</option>'; } $dttMonth = new QDateTime('2000-01-01'); for ($intMonth = 1; $intMonth <= 12; $intMonth++) { if (!$dttDateTime->IsDateNull() && $dttDateTime->Month == $intMonth || $this->intSelectedMonth == $intMonth) { $strSelected = ' selected="selected"'; } else { $strSelected = ''; } $dttMonth->Month = $intMonth; $strMonthListbox .= sprintf('<option value="%s"%s>%s</option>', $intMonth, $strSelected, $dttMonth->ToString('MMM')); } $strMonthListbox .= '</select>'; // Day $strDayListbox = sprintf('<select name="%s_lstDay" id="%s_lstDay" class="day" %s%s>', $this->strControlId, $this->strControlId, $strAttributes, $strCommand); if (!$this->blnRequired || $dttDateTime->IsDateNull()) { $strDayListbox .= '<option value="">--</option>'; } if ($dttDateTime->IsDateNull()) { if ($this->blnRequired) { // New DateTime, but we are required -- therefore, let's assume January is preselected for ($intDay = 1; $intDay <= 31; $intDay++) { $strDayListbox .= sprintf('<option value="%s">%s</option>', $intDay, $intDay); } } else { // New DateTime -- but we are NOT required // See if a month has been selected yet. if ($this->intSelectedMonth) { $intSelectedYear = $this->intSelectedYear ? $this->intSelectedYear : 2000; $intDaysInMonth = date('t', mktime(0, 0, 0, $this->intSelectedMonth, 1, $intSelectedYear)); for ($intDay = 1; $intDay <= $intDaysInMonth; $intDay++) { if ($dttDateTime->Day == $intDay || $this->intSelectedDay == $intDay) { $strSelected = ' selected="selected"'; } else { $strSelected = ''; } $strDayListbox .= sprintf('<option value="%s"%s>%s</option>', $intDay, $strSelected, $intDay); } } else { // It's ok just to have the "--" marks and nothing else } } } else { $intDaysInMonth = $dttDateTime->PHPDate('t'); for ($intDay = 1; $intDay <= $intDaysInMonth; $intDay++) { if ($dttDateTime->Day == $intDay || $this->intSelectedDay == $intDay) { $strSelected = ' selected="selected"'; } else { $strSelected = ''; } $strDayListbox .= sprintf('<option value="%s"%s>%s</option>', $intDay, $strSelected, $intDay); } } $strDayListbox .= '</select>'; // Year $strYearListbox = sprintf('<select name="%s_lstYear" id="%s_lstYear" class="year" %s%s>', $this->strControlId, $this->strControlId, $strAttributes, $strCommand); if (!$this->blnRequired || $dttDateTime->IsDateNull()) { $strYearListbox .= '<option value="">--</option>'; } for ($intYear = $this->intMinimumYear; $intYear <= $this->intMaximumYear; $intYear++) { if ($dttDateTime->Year == $intYear || $this->intSelectedYear == $intYear) { $strSelected = ' selected="selected"'; } else { $strSelected = ''; } $strYearListbox .= sprintf('<option value="%s"%s>%s</option>', $intYear, $strSelected, $intYear); } $strYearListbox .= '</select>'; // Put it all together switch ($this->strDateTimePickerFormat) { case QDateTimePickerFormat::MonthDayYear: $strToReturn .= $strMonthListbox . $strDayListbox . $strYearListbox; break; case QDateTimePickerFormat::DayMonthYear: $strToReturn .= $strDayListbox . $strMonthListbox . $strYearListbox; break; case QDateTimePickerFormat::YearMonthDay: $strToReturn .= $strYearListbox . $strMonthListbox . $strDayListbox; break; } } switch ($this->strDateTimePickerType) { case QDateTimePickerType::DateTime: case QDateTimePickerType::DateTimeSeconds: $strToReturn .= '<span class="divider"></span>'; } switch ($this->strDateTimePickerType) { case QDateTimePickerType::Time: case QDateTimePickerType::TimeSeconds: case QDateTimePickerType::DateTime: case QDateTimePickerType::DateTimeSeconds: // Hour $strHourListBox = sprintf('<select name="%s_lstHour" id="%s_lstHour" class="hour" %s>', $this->strControlId, $this->strControlId, $strAttributes); if (!$this->blnRequired || $dttDateTime->IsTimeNull()) { $strHourListBox .= '<option value="">--</option>'; } for ($intHour = 0; $intHour <= 23; $intHour++) { if (!$dttDateTime->IsTimeNull() && $dttDateTime->Hour == $intHour) { $strSelected = ' selected="selected"'; } else { $strSelected = ''; } $strHourListBox .= sprintf('<option value="%s"%s>%s</option>', $intHour, $strSelected, date('g A', mktime($intHour, 0, 0, 1, 1, 2000))); } $strHourListBox .= '</select>'; // Minute $strMinuteListBox = sprintf('<select name="%s_lstMinute" id="%s_lstMinute" class="minute" %s>', $this->strControlId, $this->strControlId, $strAttributes); if (!$this->blnRequired || $dttDateTime->IsTimeNull()) { $strMinuteListBox .= '<option value="">--</option>'; } for ($intMinute = 0; $intMinute <= 59; $intMinute++) { if (!$dttDateTime->IsTimeNull() && $dttDateTime->Minute == $intMinute) { $strSelected = ' selected="selected"'; } else { $strSelected = ''; } $strMinuteListBox .= sprintf('<option value="%s"%s>%02d</option>', $intMinute, $strSelected, $intMinute); } $strMinuteListBox .= '</select>'; // Seconds $strSecondListBox = sprintf('<select name="%s_lstSecond" id="%s_lstSecond" class="second" %s>', $this->strControlId, $this->strControlId, $strAttributes); if (!$this->blnRequired || $dttDateTime->IsTimeNull()) { $strSecondListBox .= '<option value="">--</option>'; } for ($intSecond = 0; $intSecond <= 59; $intSecond++) { if (!$dttDateTime->IsTimeNull() && $dttDateTime->Second == $intSecond) { $strSelected = ' selected="selected"'; } else { $strSelected = ''; } $strSecondListBox .= sprintf('<option value="%s"%s>%02d</option>', $intSecond, $strSelected, $intSecond); } $strSecondListBox .= '</select>'; // PUtting it all together if ($this->strDateTimePickerType == QDateTimePickerType::DateTimeSeconds || $this->strDateTimePickerType == QDateTimePickerType::TimeSeconds) { $strToReturn .= $strHourListBox . ':' . $strMinuteListBox . ':' . $strSecondListBox; } else { $strToReturn .= $strHourListBox . ':' . $strMinuteListBox; } } if ($this->strCssClass) { $strCssClass = ' class="' . $this->strCssClass . '"'; } else { $strCssClass = ''; } return sprintf('<span id="%s"%s>%s</span>', $this->strControlId, $strCssClass, $strToReturn); }
public function testSetProperties() { $obj1 = new QDateTime(); $obj1->setDate(2002, 3, 15); $this->assertTrue($obj1->IsTimeNull(), "Setting only a date after null constructor keeps time null"); $obj2 = new QDateTime("2002-03-15"); $obj3 = new QDateTime("2002-03-15 13:15"); $obj4 = new QDateTime("2002-03-16"); $this->assertTrue($obj1->IsEqualTo($obj2)); $this->assertTrue($obj1->IsEqualTo($obj3)); // dates are the same! $this->assertFalse($obj3->IsEqualTo($obj4)); // dates are different! $obj5 = new QDateTime('13:15:02', null, QDateTime::TimeOnlyType); $this->assertTrue($obj5->IsDateNull(), "Setting only a date after null constructor keeps time null"); $obj6 = new QDateTime('2002-03-15 13:15:02'); $obj1->SetTime($obj5); $this->assertFalse($obj1->IsTimeNull(), "Setting a time with object results in a change in null time status"); $this->assertTrue($obj1->IsEqualTo($obj6), "SetTime correctly combines date only and time only values"); }
/** * Construct a QDateTime. Does a few things differently than the php version: * - Always stores timestamps in local or given timezone, so time extraction is easy * - Has settings to determine if you want a date only or time only type * - Will NOT throw exceptions. Errors simply result in a null datetime. * * @param null|integer|string|QDateTime|DateTime $mixValue * @param DateTimeZone $objTimeZone * @param int $intType * * @throws QCallerException */ public function __construct($mixValue = null, DateTimeZone $objTimeZone = null, $intType = QDateTime::UnknownType) { if ($mixValue instanceof QDateTime) { // Cloning from another QDateTime object if ($objTimeZone) { throw new QCallerException('QDateTime cloning cannot take in a DateTimeZone parameter'); } parent::__construct($mixValue->format('Y-m-d H:i:s'), $mixValue->GetTimeZone()); $this->blnDateNull = $mixValue->IsDateNull(); $this->blnTimeNull = $mixValue->IsTimeNull(); $this->ReinforceNullProperties(); } else { if ($mixValue instanceof DateTime) { // Subclassing from a PHP DateTime object if ($objTimeZone) { throw new QCallerException('QDateTime subclassing of a DateTime object cannot take in a DateTimeZone parameter'); } parent::__construct($mixValue->format('Y-m-d H:i:s'), $mixValue->getTimezone()); // By definition, a DateTime object doesn't have anything nulled $this->blnDateNull = false; $this->blnTimeNull = false; } else { if (!$mixValue) { // Set to "null date" // And Do Nothing Else -- Default Values are already set to Nulled out parent::__construct('2000-01-01 00:00:00', $objTimeZone); } else { if (strtolower($mixValue) == QDateTime::Now) { // very common, so quickly deal with now string parent::__construct('now', $objTimeZone); $this->blnDateNull = false; $this->blnTimeNull = false; } else { if (substr($mixValue, 0, 1) == '@') { // unix timestamp. PHP superclass will always store ts in UTC. Our class will store in given timezone, or local tz parent::__construct(date('Y-m-d H:i:s', substr($mixValue, 1)), $objTimeZone); $this->blnDateNull = false; $this->blnTimeNull = false; } else { // string relative date or time if ($intTime = strtotime($mixValue)) { // The documentation states that: // The valid range of a timestamp is typically from // Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT. // (These are the dates that correspond to the minimum and maximum values // for a 32-bit signed integer). // // But experimentally, 0000-01-01 00:00:00 is the least date displayed correctly if ($intTime < -62167241486) { // Set to "null date" // And Do Nothing Else -- Default Values are already set to Nulled out parent::__construct('2000-01-01 00:00:00', $objTimeZone); } else { parent::__construct(date('Y-m-d H:i:s', $intTime), $objTimeZone); $this->blnDateNull = false; $this->blnTimeNull = false; } } else { // error parent::__construct(); $this->blnDateNull = true; $this->blnTimeNull = true; } } } } } } // User is requesting to force a particular type. switch ($intType) { case QDateTime::DateOnlyType: $this->blnTimeNull = true; $this->ReinforceNullProperties(); return; case QDateTime::TimeOnlyType: $this->blnDateNull = true; $this->ReinforceNullProperties(); return; case QDateTime::DateAndTimeType: // forcing both a date and time type to not be null $this->blnDateNull = false; $this->blnTimeNull = false; break; default: break; } }