TimeLib.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <?php
  2. App::uses('CakeTime', 'Utility');
  3. /**
  4. * 2012-04-06 ms
  5. */
  6. class TimeLib extends CakeTime {
  7. /**
  8. * hours, minutes
  9. * e.g. 9.3 => 9.5
  10. * 2010-11-03 ms
  11. */
  12. public static function standardToDecimalTime($value) {
  13. $base = (int)$value;
  14. $tmp = $value-$base;
  15. $tmp *= 100;
  16. $tmp *= 1/60;
  17. $value = $base+$tmp;
  18. return $value;
  19. }
  20. /**
  21. * hours, minutes
  22. * e.g. 9.5 => 9.3
  23. * with pad=2: 9.30
  24. * 2010-11-03 ms
  25. */
  26. public static function decimalToStandardTime($value, $pad = null, $decPoint = '.') {
  27. $base = (int)$value;
  28. $tmp = $value-$base;
  29. $tmp /= 1/60;
  30. $tmp /= 100;
  31. $value = $base+$tmp;
  32. if ($pad === null) {
  33. return $value;
  34. }
  35. return number_format($value, $pad, $decPoint, '');
  36. }
  37. /**
  38. * parse 2,5 - 2.5 2:30 2:31:58 or even 2011-11-12 10:10:10
  39. * now supports negative values like -2,5 -2,5 -2:30 -:30 or -4
  40. * @param string
  41. * @return int: seconds
  42. * 2011-03-06 ms
  43. */
  44. public static function parseTime($duration, $allowed = array(':', '.', ',')) {
  45. if (empty($duration)) {
  46. return 0;
  47. }
  48. $parts = explode(' ', $duration);
  49. $duration = array_pop($parts);
  50. if (strpos($duration, '.') !== false && in_array('.', $allowed)) {
  51. $duration = self::decimalToStandardTime($duration, 2, ':');
  52. } elseif (strpos($duration, ',') !== false && in_array(',', $allowed)) {
  53. $duration = str_replace(',', '.', $duration);
  54. $duration = self::decimalToStandardTime($duration, 2, ':');
  55. }
  56. # now there is only the time schema left...
  57. $pieces = explode(':', $duration, 3);
  58. $res = 0;
  59. $hours = abs((int)$pieces[0])*HOUR;
  60. //echo pre($hours);
  61. $isNegative = (strpos((string)$pieces[0], '-') !== false ? true : false);
  62. if (count($pieces) === 3) {
  63. $res += $hours + ((int)$pieces[1])*MINUTE + ((int)$pieces[2])*SECOND;
  64. } elseif (count($pieces) === 2) {
  65. $res += $hours + ((int)$pieces[1])*MINUTE;
  66. } else {
  67. $res += $hours;
  68. }
  69. if ($isNegative) {
  70. return -$res;
  71. }
  72. return $res;
  73. }
  74. /**
  75. * parse 2022-11-12 or 12.11.2022 or even 12.11.22
  76. * @param string $date
  77. * @return int: seconds
  78. * 2011-03-09 ms
  79. */
  80. public static function parseDate($date, $allowed = array('.', '-')) {
  81. $datePieces = explode(' ', $date, 2);
  82. $date = array_shift($datePieces);
  83. if (strpos($date, '.') !== false) {
  84. $pieces = explode('.', $date);
  85. $year = $pieces[2];
  86. if (strlen($year) === 2) {
  87. if ($year < 50) {
  88. $year = '20'.$year;
  89. } else {
  90. $year = '19'.$year;
  91. }
  92. }
  93. $date = mktime(0, 0, 0, $pieces[1], $pieces[0], $year);
  94. } elseif (strpos($date, '-') !== false) {
  95. //$pieces = explode('-', $date);
  96. $date = strtotime($date);
  97. } else {
  98. return 0;
  99. }
  100. return $date;
  101. }
  102. /**
  103. * return strings like 2:30 (later //TODO: or 2:33:99) from seconds etc
  104. * @param int: seconds
  105. * @return string
  106. * 2011-03-06 ms
  107. */
  108. public static function buildTime($duration, $mode = 'H:MM') {
  109. if ($duration < 0) {
  110. $duration = abs($duration);
  111. $isNegative = true;
  112. }
  113. $minutes = $duration%HOUR;
  114. $hours = ($duration - $minutes)/HOUR;
  115. $res = (int)$hours.':'.str_pad(intval($minutes/MINUTE), 2, '0', STR_PAD_LEFT);
  116. if (strpos($mode, 'SS') !== false) {
  117. //TODO
  118. }
  119. if (!empty($isNegative)) {
  120. $res = '-'.$res;
  121. }
  122. return $res;
  123. }
  124. /**
  125. * return strings like 2:33:99 from seconds etc
  126. * @param int: seconds
  127. * @return string
  128. * 2011-03-09 ms
  129. */
  130. public static function buildDefaultTime($duration) {
  131. $minutes = $duration%HOUR;
  132. $duration = $duration - $minutes;
  133. $hours = ($duration)/HOUR;
  134. //$duration = $minutes*MINUTE;
  135. $seconds = $minutes%MINUTE;
  136. return self::pad($hours).':'.self::pad($minutes/MINUTE).':'.self::pad($seconds/SECOND);
  137. }
  138. public static function pad($value, $length = 2) {
  139. return str_pad(intval($value), $length, '0', STR_PAD_LEFT);
  140. }
  141. }