Skip to content

Instantly share code, notes, and snippets.

@Langmans
Created May 20, 2015 09:05
Show Gist options
  • Save Langmans/1674e4eb37559f46c042 to your computer and use it in GitHub Desktop.
Save Langmans/1674e4eb37559f46c042 to your computer and use it in GitHub Desktop.
<?php
function strftime_win32($format, $ts = null) {
if (!$ts) $ts = time();
$mapping = array(
'%C' => sprintf("%02d", date("Y", $ts) / 100),
'%D' => '%m/%d/%y',
'%e' => sprintf("%' 2d", date("j", $ts)),
'%h' => '%b',
'%n' => "\n",
'%r' => date("h:i:s", $ts) . " %p",
'%R' => date("H:i", $ts),
'%t' => "\t",
'%T' => '%H:%M:%S',
'%u' => ($w = date("w", $ts)) ? $w : 7
);
$format = str_replace(
array_keys($mapping),
array_values($mapping),
$format
);
if($format=='%V' or $format=='%G' or $format=='%g'){
// When strftime("%V") fails, some unoptimized workaround
//
// http://en.wikipedia.org/wiki/ISO_8601 : week 1 is "the week with the year's first Thursday in it (the formal ISO definition)"
$year = strftime("%Y", $ts);
$isoyear=$year;
$first_day = strftime("%w", mktime(0, 0, 0, 1, 1, $year));
$last_day = strftime("%w", mktime(0, 0, 0, 12, 31, $year));
$number = $isonumber = strftime("%W", $ts);
// According to strftime("%W"), 1st of january is in week 1 if and only if it is a monday
if ($first_day == 1) {
$isonumber--;
}
// 1st of january is between monday and thursday; starting (now) at 0 when it should be 1
if ($first_day >= 1 && $first_day <= 4){
$isonumber++;
$isoyear=$year;
}elseif ($number == 0){
$isonumber = mktime(0, 0, 0, 12, 31, $year - 1);
$isoyear=$year;
}
if ($isonumber == 53 && ($last_day == 1 || $last_day == 2 || $last_day == 3)){
$isonumber = 1;
$isoyear=$year+1;
}
if ($format=='%V') {
return sprintf("%02d", $isonumber);
}elseif ($format=='%G'){
return sprintf("%04d", $isoyear);
}elseif ($format=='%g'){
return substr(sprintf("%04d", $isoyear),-2);
}
}else{
return strftime($format, $ts);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment