首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(php)将持续时间更改为可供我的日历使用的内容

(php)将持续时间更改为可供我的日历使用的内容
EN

Stack Overflow用户
提问于 2020-05-20 05:09:21
回答 2查看 33关注 0票数 0

我有一系列事件日期(可变持续时间),格式如下:

  • 2020年4月28日
  • 2020年5月3日至5日
  • 2020年5月3日至6月5日
  • 2020年12月20日至2021年1月15日

为了可读性,我想保持这种方式。

但是我的日历需要一种标准的方式来读取这些信息,这样它就可以输出这些事件:

  • 2020年4月28日应改为2020年4月28日至2020年4月28日
  • 2020年5月3日至5日改为2020年5月3日至5月5日
  • 2020年5月3日至6月5日应改为2020年5月3日至2020年6月5日
  • 2020年12月20日-2021年1月15日==>这个日历可以处理。

对于如何在php中做到这一点,有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-20 05:51:27

我建议您将日期存储为两个单独的值(开始/结束),然后对输出进行格式化,而不是试图解码格式化的输出。

如果您坚持这种方法,可以使用preg_match来匹配不同的格式,然后从匹配的值中提取开始日期和结束日期:

代码语言:javascript
复制
$dates = array(
    '28 April 2020',
    '3 - 5 May 2020',
    '3 May - 5 June 2020',
    '20 Dec 2020 - 15 Jan 2021'
    );

foreach ($dates as $date) {
    preg_match('/^(\d+)\s(\w+)\s(\d+)(?:\s-\s(\d+)\s(\w+)\s(\d+))?|(\d+)\s(\w+)\s-\s(\d+)\s(\w+)\s(\d+)|(\d+)\s-\s(\d+)\s(\w+)\s(\d+)$/', $date, $matches);
    if (isset($matches[12])) {
        // dd - dd mmm yyyy format
        $start_date = "${matches[12]} ${matches[14]} ${matches[15]}";
        $end_date   = "${matches[13]} ${matches[14]} ${matches[15]}";
    }
    elseif (isset($matches[7])) {
        // dd mmm - dd mmm yyyy format
        $start_date = "${matches[7]} ${matches[8]} ${matches[11]}";
        $end_date   = "${matches[9]} ${matches[10]} ${matches[11]}";
    }
    elseif (isset($matches[4])) {
        // dd mmm yyyy - dd mmm yyyy format
        $start_date = "${matches[1]} ${matches[2]} ${matches[3]}";
        $end_date   = "${matches[4]} ${matches[5]} ${matches[6]}";
    }
    elseif (isset($matches[1])) {
        // dd mmm yyyy format
        $start_date = "${matches[1]} ${matches[2]} ${matches[3]}";
        $end_date   = "${matches[1]} ${matches[2]} ${matches[3]}";
    }
    else {
        // no match
        $start_date = '???';
        $end_date = '???';
    }
    echo "$start_date - $end_date\n";
}

输出:

代码语言:javascript
复制
28 April 2020 - 28 April 2020
3 May 2020 - 5 May 2020
3 May 2020 - 5 June 2020
20 Dec 2020 - 15 Jan 2021

基于3v4l.org的演示

票数 0
EN

Stack Overflow用户

发布于 2020-05-20 05:40:06

你可以试试这样的方法:

代码语言:javascript
复制
$inputDateString = "28 April 2020";
$dateObject = DateTime::createFromFormat("j F Y",$inputDateString); 
echo $dateObject->format('d m Y') . " - " . $inputDateString->format('d m Y');

$inputDateString1 = "3 May";
$dateObject1 = DateTime::createFromFormat("j F",$inputDateString1); 

$inputDateString2 = "5 May 2020";
$dateObject2 = DateTime::createFromFormat("j F Y",$inputDateString2);
echo $dateObject1->format('d m ').date('Y'); . " - ". $dateObject2->format('d m Y');

计算间隔

代码语言:javascript
复制
$interval = $dateObject2->diff($dateObject1);
echo $interval->format('%d days');
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61905540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档