我正在维护PHP代码,这似乎使得日期/时间处理变得非常糟糕。特别是此应用程序在其他语言环境中不能很好地工作。
其中一个问题是使用不可本地化的date()
函数而不是strftime()
函数。它在内部功能中使用了几层,实际上已经使用了数千次,并且有很多不同的格式字符串。
用date()
替换strftime()
会花费太多时间。相反,我正在寻找让strftime()
处理与date()
相同的格式字符串但无法找到任何内容的方法。是否有任何已知的解决方案可以将strftime()
与date()
格式字符串一起使用?
答案 0 :(得分:1)
/**
* Convert strftime format to php date format
* @param $strftimeformat
* @return string|string[]
* @throws Exception
*/
function strftime_format_to_date_format($strftimeformat){
$unsupported = ['%U', '%V', '%C', '%g', '%G'];
$foundunsupported = [];
foreach($unsupported as $unsup){
if (strpos($strftimeformat, $unsup) !== false){
$foundunsupported[] = $unsup;
}
}
if (!empty($foundunsupported)){
throw new \Exception("Found these unsupported chars: ".implode(",", $foundunsupported).' in '.$strftimeformat);
}
// It is important to note that some do not translate accurately ie. lowercase L is supposed to convert to number with a preceding space if it is under 10, there is no accurate conversion so we just use 'g'
$phpdateformat = str_replace(
['%a','%A','%d','%e','%u','%w','%W','%b','%h','%B','%m','%y','%Y', '%D', '%F', '%x', '%n', '%t', '%H', '%k', '%I', '%l', '%M', '%p', '%P', '%r' /* %I:%M:%S %p */, '%R' /* %H:%M */, '%S', '%T' /* %H:%M:%S */, '%X', '%z', '%Z',
'%c', '%s',
'%%'],
['D','l', 'd', 'j', 'N', 'w', 'W', 'M', 'M', 'F', 'm', 'y', 'Y', 'm/d/y', 'Y-m-d', 'm/d/y',"\n","\t", 'H', 'G', 'h', 'g', 'i', 'A', 'a', 'h:i:s A', 'H:i', 's', 'H:i:s', 'H:i:s', 'O', 'T',
'D M j H:i:s Y' /*Tue Feb 5 00:45:10 2009*/, 'U',
'%'],
$strftimeformat
);
return $phpdateformat;
}
我写这个函数是因为上面的答案都不足够。处理大多数转换-易于扩展。
@see https://www.php.net/manual/en/function.date.php 和https://www.php.net/manual/en/function.strftime.php
答案 1 :(得分:0)
我猜你需要将date()
函数当前使用的格式转换为strftime()
可以使用的格式。
为此,我建议将str_replace()
与数组一起用作search
和replace
个参数:
$oldFormat = 'Y-m-d';
$search = array('Y', 'm', 'd');
$replace = array('%Y', '%m', '%d');
$newFormat = str_replace($search, $replace, $oldFormat);
当然,您应该添加所有需要转换的搜索和替换字词。
答案 2 :(得分:0)
从date()到strftime()的示例。谢谢Kick_the_BUCKET
$search = array('Y', 'y', 'M', 'm', 'D', 'd');
$replace = array('%Y', '%y', '%B', '%b', '%A %d', '%A %d');
$dateFormat = str_replace($search, $replace, $dateFormat); ?>
echo $dateFormat