DateObjectTest.php 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  1. <?php
  2. /**
  3. * Zend Framework
  4. *
  5. * LICENSE
  6. *
  7. * This source file is subject to the new BSD license that is bundled
  8. * with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://framework.zend.com/license/new-bsd
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@zend.com so we can send you a copy immediately.
  14. *
  15. * @category Zend
  16. * @package Zend_Date
  17. * @subpackage UnitTests
  18. * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
  19. * @license http://framework.zend.com/license/new-bsd New BSD License
  20. * @version $Id$
  21. */
  22. /**
  23. * Zend_Date
  24. */
  25. require_once 'Zend/Date.php';
  26. /**
  27. * @category Zend
  28. * @package Zend_Date
  29. * @subpackage UnitTests
  30. * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
  31. * @license http://framework.zend.com/license/new-bsd New BSD License
  32. * @group Zend_Date
  33. */
  34. class Zend_Date_DateObjectTest extends PHPUnit_Framework_TestCase
  35. {
  36. public function setUp()
  37. {
  38. $this->originalTimezone = date_default_timezone_get();
  39. date_default_timezone_set('Europe/Paris');
  40. require_once 'Zend/Cache.php';
  41. $this->_cache = Zend_Cache::factory('Core', 'File',
  42. array('lifetime' => 120, 'automatic_serialization' => true),
  43. array('cache_dir' => dirname(__FILE__) . '/../_files/'));
  44. Zend_Date_DateObjectTestHelper::setOptions(array('cache' => $this->_cache));
  45. }
  46. public function tearDown()
  47. {
  48. date_default_timezone_set($this->originalTimezone);
  49. $this->_cache->clean(Zend_Cache::CLEANING_MODE_ALL);
  50. }
  51. /**
  52. * Test for date object creation null value
  53. */
  54. public function testCreationNull()
  55. {
  56. // look if locale is detectable
  57. try {
  58. $locale = new Zend_Locale();
  59. } catch (Zend_Locale_Exception $e) {
  60. $this->markTestSkipped('Autodetection of locale failed');
  61. return;
  62. }
  63. $date = new Zend_Date(0);
  64. $this->assertTrue($date instanceof Zend_Date);
  65. }
  66. /**
  67. * Test for date object creation negative timestamp
  68. */
  69. public function testCreationNegative()
  70. {
  71. // look if locale is detectable
  72. try {
  73. $locale = new Zend_Locale();
  74. } catch (Zend_Locale_Exception $e) {
  75. $this->markTestSkipped('Autodetection of locale failed');
  76. return;
  77. }
  78. $date = new Zend_Date(1000);
  79. $this->assertTrue($date instanceof Zend_Date);
  80. }
  81. /**
  82. * Test for date object creation text given
  83. */
  84. public function testCreationFailed()
  85. {
  86. // look if locale is detectable
  87. try {
  88. $locale = new Zend_Locale();
  89. } catch (Zend_Locale_Exception $e) {
  90. $this->markTestSkipped('Autodetection of locale failed');
  91. return;
  92. }
  93. try {
  94. $date = new Zend_Date("notimestamp");
  95. $this->fail("exception expected");
  96. } catch (Zend_Date_Exception $e) {
  97. // success
  98. }
  99. }
  100. /**
  101. * Test for setUnixTimestamp
  102. */
  103. public function testsetUnixTimestamp()
  104. {
  105. $date = new Zend_Date_DateObjectTestHelper(Zend_Date::now());
  106. $diff = abs(time() - $date->getUnixTimestamp());
  107. $this->assertTrue(($diff < 2), "Zend_Date->setUnixTimestamp() returned a significantly "
  108. . "different timestamp than expected: $diff seconds");
  109. $date->setUnixTimestamp(0);
  110. $this->assertSame('0', (string)$date->setUnixTimestamp("12345678901234567890"));
  111. $this->assertSame("12345678901234567890", (string)$date->setUnixTimestamp("12345678901234567890"));
  112. $date->setUnixTimestamp();
  113. $diff = abs(time() - $date->getUnixTimestamp());
  114. $this->assertTrue($diff < 2, "setUnixTimestamp has a significantly different time than returned by time()): $diff seconds");
  115. }
  116. /**
  117. * Test for setUnixTimestampFailed
  118. */
  119. public function testsetUnixTimestampFailed()
  120. {
  121. try {
  122. $date = new Zend_Date_DateObjectTestHelper(Zend_Date::now());
  123. $date->setUnixTimestamp("notimestamp");
  124. $this->fail("exception expected");
  125. } catch (Zend_Date_Exception $e) {
  126. // success
  127. }
  128. }
  129. /**
  130. * Test for getUnixTimestamp
  131. */
  132. public function testgetUnixTimestamp()
  133. {
  134. $date = new Zend_Date_DateObjectTestHelper(Zend_Date::now());
  135. $result = $date->getUnixTimestamp();
  136. $diff = abs($result - time());
  137. $this->assertTrue($diff < 2, "Instance of Zend_Date_DateObject has a significantly different time than returned by setTime(): $diff seconds");
  138. }
  139. /**
  140. * Test for mktime
  141. */
  142. public function testMkTimeforDateValuesInPHPRange()
  143. {
  144. $date = new Zend_Date_DateObjectTestHelper(Zend_Date::now());
  145. $this->assertSame( mktime(0, 0, 0, 12, 30, 2037), $date->mktime(0, 0, 0, 12, 30, 2037, false));
  146. $this->assertSame(gmmktime(0, 0, 0, 12, 30, 2037), $date->mktime(0, 0, 0, 12, 30, 2037, true ));
  147. $this->assertSame( mktime(0, 0, 0, 1, 1, 2000), $date->mktime(0, 0, 0, 1, 1, 2000, false));
  148. $this->assertSame(gmmktime(0, 0, 0, 1, 1, 2000), $date->mktime(0, 0, 0, 1, 1, 2000, true ));
  149. $this->assertSame( mktime(0, 0, 0, 1, 1, 1970), $date->mktime(0, 0, 0, 1, 1, 1970, false));
  150. $this->assertSame(gmmktime(0, 0, 0, 1, 1, 1970), $date->mktime(0, 0, 0, 1, 1, 1970, true ));
  151. $this->assertSame( mktime(0, 0, 0, 12, 30, 1902), $date->mktime(0, 0, 0, 12, 30, 1902, false));
  152. $this->assertSame(gmmktime(0, 0, 0, 12, 30, 1902), $date->mktime(0, 0, 0, 12, 30, 1902, true ));
  153. }
  154. /**
  155. * Test for mktime
  156. */
  157. public function testMkTimeforDateValuesGreaterPHPRange()
  158. {
  159. $date = new Zend_Date_DateObjectTestHelper(Zend_Date::now());
  160. $this->assertSame(2232658800, $date->mktime(0, 0, 0,10, 1, 2040, false));
  161. $this->assertSame(2232662400, $date->mktime(0, 0, 0,10, 1, 2040, true ));
  162. $this->assertSame(7258114800, $date->mktime(0, 0, 0, 1, 1, 2200, false));
  163. $this->assertSame(7258118400, $date->mktime(0, 0, 0, 1, 1, 2200, true ));
  164. $this->assertSame(16749586800, $date->mktime(0, 0, 0,10,10, 2500, false));
  165. $this->assertSame(16749590400, $date->mktime(0, 0, 0,10,10, 2500, true ));
  166. $this->assertSame(32503676400, $date->mktime(0, 0, 0, 1, 1, 3000, false));
  167. $this->assertSame(32503680000, $date->mktime(0, 0, 0, 1, 1, 3000, true ));
  168. $this->assertSame(95617580400, $date->mktime(0, 0, 0, 1, 1, 5000, false));
  169. $this->assertSame(95617584000, $date->mktime(0, 0, 0, 1, 1, 5000, true ));
  170. // test for different set external timezone
  171. // the internal timezone should always be used for calculation
  172. $date->setTimezone('Europe/Paris');
  173. $this->assertSame(1577833200, $date->mktime(0, 0, 0, 1, 1, 2020, false));
  174. $this->assertSame(1577836800, $date->mktime(0, 0, 0, 1, 1, 2020, true ));
  175. date_default_timezone_set('Indian/Maldives');
  176. $this->assertSame(1577833200, $date->mktime(0, 0, 0, 1, 1, 2020, false));
  177. $this->assertSame(1577836800, $date->mktime(0, 0, 0, 1, 1, 2020, true ));
  178. }
  179. /**
  180. * Test for mktime
  181. */
  182. public function testMkTimeforDateValuesSmallerPHPRange()
  183. {
  184. $date = new Zend_Date_DateObjectTestHelper(Zend_Date::now());
  185. $this->assertSame(-2208992400, $date->mktime(0, 0, 0, 1, 1, 1900, false));
  186. $this->assertSame(-2208988800, $date->mktime(0, 0, 0, 1, 1, 1900, true ));
  187. $this->assertSame(-8520339600, $date->mktime(0, 0, 0, 1, 1, 1700, false));
  188. $this->assertSame(-8520336000, $date->mktime(0, 0, 0, 1, 1, 1700, true ));
  189. $this->assertSame(-14830995600, $date->mktime(0, 0, 0, 1, 1, 1500, false));
  190. $this->assertSame(-14830992000, $date->mktime(0, 0, 0, 1, 1, 1500, true ));
  191. $this->assertSame(-12219321600, $date->mktime(0, 0, 0,10,10, 1582, false));
  192. $this->assertSame(-12219321600, $date->mktime(0, 0, 0,10,10, 1582, true ));
  193. $this->assertSame(-30609795600, $date->mktime(0, 0, 0, 1, 1, 1000, false));
  194. $this->assertSame(-30609792000, $date->mktime(0, 0, 0, 1, 1, 1000, true ));
  195. $this->assertSame(-62167395600, $date->mktime(0, 0, 0, 1, 1, 0, false));
  196. $this->assertSame(-62167392000, $date->mktime(0, 0, 0, 1, 1, 0, true ));
  197. $this->assertSame(-125282595600, $date->mktime(0, 0, 0, 1, 1,-2000, false));
  198. $this->assertSame(-125282592000, $date->mktime(0, 0, 0, 1, 1,-2000, true));
  199. $this->assertSame(-2208992400, $date->mktime(0, 0, 0, 13, 1, 1899, false));
  200. $this->assertSame(-2208988800, $date->mktime(0, 0, 0, 13, 1, 1899, true));
  201. $this->assertSame(-2208992400, $date->mktime(0, 0, 0,-11, 1, 1901, false));
  202. $this->assertSame(-2208988800, $date->mktime(0, 0, 0,-11, 1, 1901, true));
  203. }
  204. public function testIsLeapYear()
  205. {
  206. $date = new Zend_Date_DateObjectTestHelper(Zend_Date::now());
  207. $this->assertTrue ($date->checkLeapYear(2000));
  208. $this->assertFalse($date->checkLeapYear(2002));
  209. $this->assertTrue ($date->checkLeapYear(2004));
  210. $this->assertFalse($date->checkLeapYear(1899));
  211. $this->assertTrue ($date->checkLeapYear(1500));
  212. $this->assertFalse($date->checkLeapYear(1455));
  213. }
  214. public function testWeekNumber()
  215. {
  216. $date = new Zend_Date_DateObjectTestHelper(Zend_Date::now());
  217. $this->assertSame((int) date('W',mktime(0, 0, 0, 1, 1, 2000)), $date->weekNumber(2000, 1, 1));
  218. $this->assertSame((int) date('W',mktime(0, 0, 0, 10, 1, 2020)), $date->weekNumber(2020, 10, 1));
  219. $this->assertSame((int) date('W',mktime(0, 0, 0, 5, 15, 2005)), $date->weekNumber(2005, 5, 15));
  220. $this->assertSame((int) date('W',mktime(0, 0, 0, 11, 22, 1994)), $date->weekNumber(1994, 11, 22));
  221. $this->assertSame((int) date('W',mktime(0, 0, 0, 12, 31, 2000)), $date->weekNumber(2000, 12, 31));
  222. $this->assertSame(52, $date->weekNumber(2050, 12, 31));
  223. $this->assertSame(23, $date->weekNumber(2050, 6, 6));
  224. $this->assertSame(52, $date->weekNumber(2056, 1, 1));
  225. $this->assertSame(52, $date->weekNumber(2049, 12, 31));
  226. $this->assertSame(53, $date->weekNumber(2048, 12, 31));
  227. $this->assertSame( 1, $date->weekNumber(2047, 12, 31));
  228. }
  229. public function testDayOfWeek()
  230. {
  231. $date = new Zend_Date_DateObjectTestHelper(Zend_Date::now());
  232. $this->assertSame((int) date('w',mktime(0, 0, 0, 1, 1, 2000)), $date->dayOfWeekHelper(2000, 1, 1));
  233. $this->assertSame((int) date('w',mktime(0, 0, 0, 1, 2, 2000)), $date->dayOfWeekHelper(2000, 1, 2));
  234. $this->assertSame((int) date('w',mktime(0, 0, 0, 1, 3, 2000)), $date->dayOfWeekHelper(2000, 1, 3));
  235. $this->assertSame((int) date('w',mktime(0, 0, 0, 1, 4, 2000)), $date->dayOfWeekHelper(2000, 1, 4));
  236. $this->assertSame((int) date('w',mktime(0, 0, 0, 1, 5, 2000)), $date->dayOfWeekHelper(2000, 1, 5));
  237. $this->assertSame((int) date('w',mktime(0, 0, 0, 1, 6, 2000)), $date->dayOfWeekHelper(2000, 1, 6));
  238. $this->assertSame((int) date('w',mktime(0, 0, 0, 1, 7, 2000)), $date->dayOfWeekHelper(2000, 1, 7));
  239. $this->assertSame((int) date('w',mktime(0, 0, 0, 1, 8, 2000)), $date->dayOfWeekHelper(2000, 1, 8));
  240. $this->assertSame(6, $date->dayOfWeekHelper(2050, 1, 1));
  241. $this->assertSame(0, $date->dayOfWeekHelper(2050, 1, 2));
  242. $this->assertSame(1, $date->dayOfWeekHelper(2050, 1, 3));
  243. $this->assertSame(2, $date->dayOfWeekHelper(2050, 1, 4));
  244. $this->assertSame(3, $date->dayOfWeekHelper(2050, 1, 5));
  245. $this->assertSame(4, $date->dayOfWeekHelper(2050, 1, 6));
  246. $this->assertSame(5, $date->dayOfWeekHelper(2050, 1, 7));
  247. $this->assertSame(6, $date->dayOfWeekHelper(2050, 1, 8));
  248. $this->assertSame(4, $date->dayOfWeekHelper(1500, 1, 1));
  249. }
  250. public function testCalcSunInternal()
  251. {
  252. $date = new Zend_Date_DateObjectTestHelper(10000000);
  253. $this->assertSame( 9961681, $date->calcSun(array('latitude' => 38.4, 'longitude' => -29), -0.0145439, true ));
  254. $this->assertSame(10010367, $date->calcSun(array('latitude' => 38.4, 'longitude' => -29), -0.0145439, false));
  255. $this->assertSame( 9967006, $date->calcSun(array('latitude' => -38.4, 'longitude' => -29), -0.0145439, true ));
  256. $this->assertSame(10005042, $date->calcSun(array('latitude' => -38.4, 'longitude' => -29), -0.0145439, false));
  257. $this->assertSame( 9947773, $date->calcSun(array('latitude' => 38.4, 'longitude' => 29), -0.0145439, true ));
  258. $this->assertSame( 9996438, $date->calcSun(array('latitude' => 38.4, 'longitude' => 29), -0.0145439, false));
  259. $this->assertSame( 9953077, $date->calcSun(array('latitude' => -38.4, 'longitude' => 29), -0.0145439, true ));
  260. $this->assertSame( 9991134, $date->calcSun(array('latitude' => -38.4, 'longitude' => 29), -0.0145439, false));
  261. $this->assertSame( 9923795, $date->calcSun(array('latitude' => 38.4, 'longitude' => 129), -0.0145439, true ));
  262. $this->assertSame( 9972422, $date->calcSun(array('latitude' => 38.4, 'longitude' => 129), -0.0145439, false));
  263. $this->assertSame( 9929062, $date->calcSun(array('latitude' => -38.4, 'longitude' => 129), -0.0145439, true ));
  264. $this->assertSame( 9967155, $date->calcSun(array('latitude' => -38.4, 'longitude' => 129), -0.0145439, false));
  265. $this->assertSame( 9985660, $date->calcSun(array('latitude' => 38.4, 'longitude' =>-129), -0.0145439, true ));
  266. $this->assertSame(10034383, $date->calcSun(array('latitude' => 38.4, 'longitude' =>-129), -0.0145439, false));
  267. $this->assertSame( 9991022, $date->calcSun(array('latitude' => -38.4, 'longitude' =>-129), -0.0145439, true ));
  268. $this->assertSame(10029021, $date->calcSun(array('latitude' => -38.4, 'longitude' =>-129), -0.0145439, false));
  269. $date = new Zend_Date_DateObjectTestHelper(-148309884);
  270. $this->assertSame(-148322663, $date->calcSun(array('latitude' => 38.4, 'longitude' => -29), -0.0145439, true ));
  271. $this->assertSame(-148274758, $date->calcSun(array('latitude' => 38.4, 'longitude' => -29), -0.0145439, false));
  272. $this->assertSame(-148318117, $date->calcSun(array('latitude' => -38.4, 'longitude' => -29), -0.0145439, true ));
  273. $this->assertSame(-148279304, $date->calcSun(array('latitude' => -38.4, 'longitude' => -29), -0.0145439, false));
  274. $this->assertSame(-148336570, $date->calcSun(array('latitude' => 38.4, 'longitude' => 29), -0.0145439, true ));
  275. $this->assertSame(-148288687, $date->calcSun(array('latitude' => 38.4, 'longitude' => 29), -0.0145439, false));
  276. $this->assertSame(-148332046, $date->calcSun(array('latitude' => -38.4, 'longitude' => 29), -0.0145439, true ));
  277. $this->assertSame(-148293211, $date->calcSun(array('latitude' => -38.4, 'longitude' => 29), -0.0145439, false));
  278. $this->assertSame(-148360548, $date->calcSun(array('latitude' => 38.4, 'longitude' => 129), -0.0145439, true ));
  279. $this->assertSame(-148312703, $date->calcSun(array('latitude' => 38.4, 'longitude' => 129), -0.0145439, false));
  280. $this->assertSame(-148356061, $date->calcSun(array('latitude' => -38.4, 'longitude' => 129), -0.0145439, true ));
  281. $this->assertSame(-148317189, $date->calcSun(array('latitude' => -38.4, 'longitude' => 129), -0.0145439, false));
  282. $this->assertSame(-148298686, $date->calcSun(array('latitude' => 38.4, 'longitude' =>-129), -0.0145439, true ));
  283. $this->assertSame(-148250742, $date->calcSun(array('latitude' => 38.4, 'longitude' =>-129), -0.0145439, false));
  284. $this->assertSame(-148294101, $date->calcSun(array('latitude' => -38.4, 'longitude' =>-129), -0.0145439, true ));
  285. $this->assertSame(-148255327, $date->calcSun(array('latitude' => -38.4, 'longitude' =>-129), -0.0145439, false));
  286. }
  287. public function testGetDate()
  288. {
  289. $date = new Zend_Date_DateObjectTestHelper(0);
  290. $this->assertTrue(is_array($date->getDateParts()));
  291. $this->assertTrue(is_array($date->getDateParts(1000000)));
  292. $test = array( 'seconds' => 40, 'minutes' => 46,
  293. 'hours' => 14, 'mday' => 12, 'wday' => 1,
  294. 'mon' => 1, 'year' => 1970, 'yday' => 11,
  295. 'weekday' => 'Monday', 'month' => 'January', 0 => 1000000);
  296. $result = $date->getDateParts(1000000);
  297. $this->assertSame((int) $test['seconds'], (int) $result['seconds']);
  298. $this->assertSame((int) $test['minutes'], (int) $result['minutes']);
  299. $this->assertSame((int) $test['hours'], (int) $result['hours'] );
  300. $this->assertSame((int) $test['mday'], (int) $result['mday'] );
  301. $this->assertSame((int) $test['wday'], (int) $result['wday'] );
  302. $this->assertSame((int) $test['mon'], (int) $result['mon'] );
  303. $this->assertSame((int) $test['year'], (int) $result['year'] );
  304. $this->assertSame((int) $test['yday'], (int) $result['yday'] );
  305. $this->assertSame( $test['weekday'], $result['weekday']);
  306. $this->assertSame( $test['month'], $result['month'] );
  307. $this->assertSame( $test[0], $result[0] );
  308. $test = array( 'seconds' => 20, 'minutes' => 33,
  309. 'hours' => 11, 'mday' => 6, 'wday' => 3,
  310. 'mon' => 3, 'year' => 1748, 'yday' => 65,
  311. 'weekday' => 'Wednesday', 'month' => 'February', 0 => -7000000000);
  312. $result = $date->getDateParts(-7000000000);
  313. $this->assertSame((int) $test['seconds'], (int) $result['seconds']);
  314. $this->assertSame((int) $test['minutes'], (int) $result['minutes']);
  315. $this->assertSame((int) $test['hours'], (int) $result['hours'] );
  316. $this->assertSame((int) $test['mday'], (int) $result['mday'] );
  317. $this->assertSame((int) $test['wday'], (int) $result['wday'] );
  318. $this->assertSame((int) $test['mon'], (int) $result['mon'] );
  319. $this->assertSame((int) $test['year'], (int) $result['year'] );
  320. $this->assertSame((int) $test['yday'], (int) $result['yday'] );
  321. $this->assertSame( $test['weekday'], $result['weekday']);
  322. $this->assertSame( $test['month'], $result['month'] );
  323. $this->assertSame( $test[0], $result[0] );
  324. $test = array( 'seconds' => 0, 'minutes' => 40,
  325. 'hours' => 2, 'mday' => 26, 'wday' => 2,
  326. 'mon' => 8, 'year' => 2188, 'yday' => 238,
  327. 'weekday' => 'Tuesday', 'month' => 'July', 0 => 6900000000);
  328. $result = $date->getDateParts(6900000000);
  329. $this->assertSame((int) $test['seconds'], (int) $result['seconds']);
  330. $this->assertSame((int) $test['minutes'], (int) $result['minutes']);
  331. $this->assertSame((int) $test['hours'], (int) $result['hours'] );
  332. $this->assertSame((int) $test['mday'], (int) $result['mday'] );
  333. $this->assertSame((int) $test['wday'], (int) $result['wday'] );
  334. $this->assertSame((int) $test['mon'], (int) $result['mon'] );
  335. $this->assertSame((int) $test['year'], (int) $result['year'] );
  336. $this->assertSame((int) $test['yday'], (int) $result['yday'] );
  337. $this->assertSame( $test['weekday'], $result['weekday']);
  338. $this->assertSame( $test['month'], $result['month'] );
  339. $this->assertSame( $test[0], $result[0] );
  340. $test = array( 'seconds' => 0, 'minutes' => 40,
  341. 'hours' => 2, 'mday' => 26, 'wday' => 3,
  342. 'mon' => 8, 'year' => 2188, 'yday' => 238,
  343. 'weekday' => 'Wednesday', 'month' => 'July', 0 => 6900000000);
  344. $result = $date->getDateParts(6900000000, true);
  345. $this->assertSame((int) $test['seconds'], (int) $result['seconds']);
  346. $this->assertSame((int) $test['minutes'], (int) $result['minutes']);
  347. $this->assertSame((int) $test['hours'], (int) $result['hours'] );
  348. $this->assertSame((int) $test['mday'], (int) $result['mday'] );
  349. $this->assertSame((int) $test['mon'], (int) $result['mon'] );
  350. $this->assertSame((int) $test['year'], (int) $result['year'] );
  351. $this->assertSame((int) $test['yday'], (int) $result['yday'] );
  352. }
  353. public function testDate()
  354. {
  355. $date = new Zend_Date_DateObjectTestHelper(0);
  356. $this->assertTrue($date->date('U') > 0);
  357. $this->assertSame( '0', $date->date('U',0 ));
  358. $this->assertSame( '0', $date->date('U',0,false ));
  359. $this->assertSame( '0', $date->date('U',0,true ));
  360. $this->assertSame( '6900000000', $date->date('U',6900000000 ));
  361. $this->assertSame( '-7000000000', $date->date('U',-7000000000));
  362. $this->assertSame( '06', $date->date('d',-7000000000));
  363. $this->assertSame( 'Wed', $date->date('D',-7000000000));
  364. $this->assertSame( '6', $date->date('j',-7000000000));
  365. $this->assertSame( 'Wednesday', $date->date('l',-7000000000));
  366. $this->assertSame( '3', $date->date('N',-7000000000));
  367. $this->assertSame( 'th', $date->date('S',-7000000000));
  368. $this->assertSame( '3', $date->date('w',-7000000000));
  369. $this->assertSame( '65', $date->date('z',-7000000000));
  370. $this->assertSame( '10', $date->date('W',-7000000000));
  371. $this->assertSame( 'March', $date->date('F',-7000000000));
  372. $this->assertSame( '03', $date->date('m',-7000000000));
  373. $this->assertSame( 'Mar', $date->date('M',-7000000000));
  374. $this->assertSame( '3', $date->date('n',-7000000000));
  375. $this->assertSame( '31', $date->date('t',-7000000000));
  376. $this->assertSame( 'CET', $date->date('T',-7000000000));
  377. $this->assertSame( '1', $date->date('L',-7000000000));
  378. $this->assertSame( '1748', $date->date('o',-7000000000));
  379. $this->assertSame( '1748', $date->date('Y',-7000000000));
  380. $this->assertSame( '48', $date->date('y',-7000000000));
  381. $this->assertSame( 'pm', $date->date('a',-7000000000));
  382. $this->assertSame( 'PM', $date->date('A',-7000000000));
  383. $this->assertSame( '523', $date->date('B',-7000000000));
  384. $this->assertSame( '12', $date->date('g',-7000000000));
  385. $this->assertSame( '12', $date->date('G',-7000000000));
  386. $this->assertSame( '12', $date->date('h',-7000000000));
  387. $this->assertSame( '12', $date->date('H',-7000000000));
  388. $this->assertSame( '33', $date->date('i',-7000000000));
  389. $this->assertSame( '20', $date->date('s',-7000000000));
  390. $this->assertSame('Europe/Paris', $date->date('e',-7000000000));
  391. $this->assertSame( '0', $date->date('I',-7000000000));
  392. $this->assertSame( '+0100', $date->date('O',-7000000000));
  393. $this->assertSame( '+01:00', $date->date('P',-7000000000));
  394. $this->assertSame( 'CET', $date->date('T',-7000000000));
  395. $this->assertSame( '3600', $date->date('Z',-7000000000));
  396. $this->assertSame('1748-03-06T12:33:20+01:00', $date->date('c',-7000000000));
  397. $this->assertSame('Wed, 06 Mar 1748 12:33:20 +0100', $date->date('r',-7000000000));
  398. $this->assertSame( '-7000000000', $date->date('U' ,-7000000000 ));
  399. $this->assertSame( 'H', $date->date('\\H' ,-7000000000 ));
  400. $this->assertSame( '.', $date->date('.' ,-7000000000 ));
  401. $this->assertSame( '12:33:20', $date->date('H:i:s',-7000000000 ));
  402. $this->assertSame( '06-Mar-1748', $date->date('d-M-Y',-7000000000 ));
  403. $this->assertSame( '6900000000', $date->date('U',6900000000, true));
  404. $this->assertSame( '152', $date->date('B',6900000000, true));
  405. $this->assertSame( '12', $date->date('g',6899993000, true));
  406. $this->assertSame( '1', $date->date('g',6899997000, true));
  407. $this->assertSame( '1', $date->date('g',6900039200, true));
  408. $this->assertSame( '12', $date->date('h',6899993000, true));
  409. $this->assertSame( '01', $date->date('h',6899997000, true));
  410. $this->assertSame( '01', $date->date('h',6900040200, true));
  411. $this->assertSame( 'UTC', $date->date('e',-7000000000,true));
  412. $this->assertSame( '0', $date->date('I',-7000000000,true));
  413. $this->assertSame( 'GMT', $date->date('T',-7000000000,true));
  414. $this->assertSame( '6', $date->date('N',6899740800, true));
  415. $this->assertSame( 'st', $date->date('S',6900518000, true));
  416. $this->assertSame( 'nd', $date->date('S',6900604800, true));
  417. $this->assertSame( 'rd', $date->date('S',6900691200, true));
  418. $this->assertSame( '7', $date->date('N',6900432000, true));
  419. $date->setTimezone('Europe/Vienna');
  420. date_default_timezone_set('Indian/Maldives');
  421. $reference = $date->date('U');
  422. $this->assertTrue(abs($reference - time()) < 2);
  423. $this->assertSame('69000000', $date->date('U',69000000));
  424. // ISO Year (o) depends on the week number so 1.1. can be last year is week is 52/53
  425. $this->assertSame('1739', $date->date('o',$date->mktime(0, 0, 0, 1, 1, 1740)));
  426. $this->assertSame('1740', $date->date('o',$date->mktime(0, 0, 0, 1, 1, 1741)));
  427. $this->assertSame('1742', $date->date('o',$date->mktime(0, 0, 0, 1, 1, 1742)));
  428. $this->assertSame('1743', $date->date('o',$date->mktime(0, 0, 0, 1, 1, 1743)));
  429. $this->assertSame('1744', $date->date('o',$date->mktime(0, 0, 0, 1, 1, 1744)));
  430. $this->assertSame('1744', $date->date('o',$date->mktime(0, 0, 0, 1, 1, 1745)));
  431. $this->assertSame('1745', $date->date('o',$date->mktime(0, 0, 0, 1, 1, 1746)));
  432. $this->assertSame('1746', $date->date('o',$date->mktime(0, 0, 0, 1, 1, 1747)));
  433. $this->assertSame('1748', $date->date('o',$date->mktime(0, 0, 0, 1, 1, 1748)));
  434. $this->assertSame('1749', $date->date('o',$date->mktime(0, 0, 0, 1, 1, 1749)));
  435. $this->assertSame('2049', $date->date('o',$date->mktime(0, 0, 0, 1, 1, 2050)));
  436. $this->assertSame('2050', $date->date('o',$date->mktime(0, 0, 0, 1, 1, 2051)));
  437. $this->assertSame('2052', $date->date('o',$date->mktime(0, 0, 0, 1, 1, 2052)));
  438. $this->assertSame('2053', $date->date('o',$date->mktime(0, 0, 0, 1, 1, 2053)));
  439. $this->assertSame('2054', $date->date('o',$date->mktime(0, 0, 0, 1, 1, 2054)));
  440. }
  441. function testMktimeDay0And32()
  442. {
  443. // the following functionality is used by isTomorrow() and isYesterday() in Zend_Date.
  444. $date = new Zend_Date_DateObjectTestHelper(0);
  445. $this->assertSame('20060101', $date->date('Ymd', $date->mktime(0, 0, 0, 12, 32, 2005)));
  446. $this->assertSame('20050301', $date->date('Ymd', $date->mktime(0, 0, 0, 2, 29, 2005)));
  447. $this->assertSame('20051231', $date->date('Ymd', $date->mktime(0, 0, 0, 1, 0, 2006)));
  448. $this->assertSame('20050131', $date->date('Ymd', $date->mktime(0, 0, 0, 2, 0, 2005)));
  449. }
  450. /**
  451. * Test for setTimezone()
  452. */
  453. public function testSetTimezone()
  454. {
  455. $date = new Zend_Date_DateObjectTestHelper(0);
  456. date_default_timezone_set('Europe/Vienna');
  457. $date->setTimezone('Indian/Maldives');
  458. $this->assertSame('Indian/Maldives', $date->getTimezone());
  459. try {
  460. $date->setTimezone('Unknown');
  461. // without new phpdate false timezones do not throw an exception !
  462. // known and expected behaviour
  463. if (function_exists('timezone_open')) {
  464. $this->fail("exception expected");
  465. }
  466. } catch (Zend_Date_Exception $e) {
  467. $this->assertRegexp('/not a known timezone/i', $e->getMessage());
  468. $this->assertSame('Unknown', $e->getOperand());
  469. }
  470. $this->assertSame('Indian/Maldives', $date->getTimezone());
  471. $date->setTimezone();
  472. $this->assertSame('Europe/Vienna', $date->getTimezone());
  473. }
  474. /**
  475. * Test for gmtOffset
  476. */
  477. public function testgetGmtOffset()
  478. {
  479. $date = new Zend_Date_DateObjectTestHelper(0);
  480. date_default_timezone_set('Europe/Vienna');
  481. $date->setTimezone();
  482. $this->assertSame(-3600, $date->getGmtOffset());
  483. $date->setTimezone('GMT');
  484. $this->assertSame( 0, $date->getGmtOffset());
  485. }
  486. /**
  487. * Test for _getTime
  488. */
  489. public function test_getTime()
  490. {
  491. $date = new Zend_Date_DateObjectTestHelper(Zend_Date::now());
  492. $time = $date->_getTime();
  493. $diff = abs(time() - $time);
  494. $this->assertTrue(($diff < 2), "Zend_Date_DateObject->_getTime() returned a significantly "
  495. . "different timestamp than expected: $diff seconds");
  496. }
  497. /**
  498. * Test for RFC 2822's Obsolete Date and Time (paragraph 4.3)
  499. *
  500. * @see ZF-11296
  501. */
  502. public function test_obsRfc2822()
  503. {
  504. $date = new Zend_Date();
  505. /* Obsolete timezones */
  506. $this->assertTrue($date->set("Mon, 15 Aug 2005 15:52:01 +0000", Zend_Date::RFC_2822) instanceof Zend_Date);
  507. $this->assertTrue($date->set("Mon, 15 Aug 2005 15:52:01 UT", Zend_Date::RFC_2822) instanceof Zend_Date);
  508. $this->assertTrue($date->set("Mon, 15 Aug 2005 15:52:01 GMT", Zend_Date::RFC_2822) instanceof Zend_Date);
  509. $this->assertTrue($date->set("Mon, 15 Aug 2005 15:52:01 EST", Zend_Date::RFC_2822) instanceof Zend_Date);
  510. $this->assertTrue($date->set("Mon, 15 Aug 2005 15:52:01 I", Zend_Date::RFC_2822) instanceof Zend_Date);
  511. $this->assertTrue($date->set("Mon, 15 Aug 2005 15:52:01 Z", Zend_Date::RFC_2822) instanceof Zend_Date);
  512. }
  513. public function testToStringShouldEqualWithAndWithoutPhpFormat()
  514. {
  515. $date = new Zend_Date('22.05.2014');
  516. $date->setTime('12:00');
  517. $date->setTimezone('America/Los_Angeles');
  518. $this->assertEquals(
  519. $date->toString(Zend_Date::ATOM),
  520. $date->toString(DateTime::ATOM, 'php')
  521. );
  522. }
  523. }
  524. class Zend_Date_DateObjectTestHelper extends Zend_Date
  525. {
  526. public function __construct($date = null, $part = null, $locale = null)
  527. {
  528. $this->setTimezone('Europe/Paris');
  529. parent::__construct($date, $part, $locale);
  530. }
  531. public function mktime($hour, $minute, $second, $month, $day, $year, $dst= -1, $gmt = false)
  532. {
  533. return parent::mktime($hour, $minute, $second, $month, $day, $year, $dst, $gmt);
  534. }
  535. public function getUnixTimestamp()
  536. {
  537. return parent::getUnixTimestamp();
  538. }
  539. public function setUnixTimestamp($timestamp = null)
  540. {
  541. return parent::setUnixTimestamp($timestamp);
  542. }
  543. public function weekNumber($year, $month, $day)
  544. {
  545. return parent::weekNumber($year, $month, $day);
  546. }
  547. public function dayOfWeekHelper($y, $m, $d)
  548. {
  549. return Zend_Date_DateObject::dayOfWeek($y, $m, $d);
  550. }
  551. public function calcSun($location, $horizon, $rise = false)
  552. {
  553. return parent::calcSun($location, $horizon, $rise);
  554. }
  555. public function date($format, $timestamp = null, $gmt = false)
  556. {
  557. return parent::date($format, $timestamp, $gmt);
  558. }
  559. public function getDateParts($timestamp = null, $fast = null)
  560. {
  561. return parent::getDateParts($timestamp, $fast);
  562. }
  563. public function _getTime($sync = null)
  564. {
  565. return parent::_getTime($sync);
  566. }
  567. }