我有一个像json这样的字符串:" 2016-2-16 13:48: 3 "
请注意,秒数不会为零,我需要在将日期插入数据库之前验证日期格式是否正确,
所以我创建了一个函数来使用date_format函数验证日期,如下所示:
function validateDate($date, $format = 'Y-m-d H:i:s')
{
$d = DateTime::createFromFormat($format, $date);
if ($d) {
return $date;
} else {
return null;
}
}
我的问题当秒没有引导0时它返回null,因为格式没有秒而没有前导0,所以秒应该像" 03"而不只是" 3",
有什么想法吗?
答案 0 :(得分:3)
如果你无法修复JSON,我会使用preg_replace手动替换掉单个数字的秒和分钟 - 应该很简单,因为你只需要在0
前面填充 $pattern = '/:(.)$/';
$fixed_seconds = preg_replace($pattern, ':0${1}', "2016-2-16 13:48:3");
echo $fixed_seconds;
。
以下是您可以更换秒数的方法:
$pattern = '/:(.):/';
$fixed_minutes = preg_replace($pattern, ':0${1}:', "2016-2-16 13:4:03");
分钟你可以使用这种模式:
$format = 'Y-n-j G:i:s'
然后,如果这两个人将你的格式字符串改为:
func Foo(s *someStruct) {
fmt.Printf("s is %v\n", s)
if s!=nil {
fmt.Printf("s is not nil")
...
}
}
答案 1 :(得分:1)
这可能有点复杂,但可以完成工作:
$date = "2016-2-16 13:48:3";
$dateArray = explode(":", $date);
$newDate = array();
foreach ($dateArray as $splitDate) {
if (strlen($splitDate) == 1)
$newDate[] = "0".$splitDate;
else
$newDate[] = $splitDate;
}
$date = implode(":", $newDate);
答案 2 :(得分:1)
日期格式化只准备使用带有初始零(选项s)的秒,所以我想你需要做这样的事情:
function validateDate($date, $format = 'Y-m-d H:i:s')
{
$crackedDate = explode(':', $date);
$newDate = '';
foreach($crackedDate as $datePart) {
if (strlen($datePart)==1) {
$newDate .= '0'.$datePart;
continue;
}
}
$d = DateTime::createFromFormat($format, $newDate);
if ($d) {
return $date;
} else {
return null;
}
}
在php日期中,对于秒或分钟的非初始零格式没有已知格式,因此解决方案最终成为这样的自定义函数,因此这是一种无法使用所有dateTime格式的解决方法,只是问题一和其他一些人,请记住日期格式有很多选项
答案 3 :(得分:1)
非常奇怪的日期格式!
我认为唯一的方法是预处理$date
。 “气味”是您的功能支持多种格式验证。
我建议你这样:
function validateDate( $date, $format = 'Y-m-d H:i:s' )
{
$date = preg_replace( '/:0+(\d{2})/', ':\1', str_replace( ':',':0',$date ) );
$d = DateTime::createFromFormat($format, $date);
if ($d) {
return $date;
} else {
return null;
}
}
的 eval.in demo 强>
(编辑:更改正则表达式以匹配分钟)