首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP人工日期范围/持续时间格式

PHP人工日期范围/持续时间格式
EN

Stack Overflow用户
提问于 2015-04-30 19:19:59
回答 3查看 1.7K关注 0票数 3

PHP做得很好,我想知道是否有一个函数可以满足我的需要。

对于持续超过一天的事件,人类的格式化方式是复杂的。

例子..。

活动一:从2015-04-20到2015-04-22可以为人类设定如下格式:2015年4月20日-22日

活动二: 2015-04-01至2015-05-31人-> 2015年4月至5月

活动三: 2015-04-30至2015-05-02人类-> 4月30日至5月2日

总之,不要重复不需要重复的事情。尽可能多地与"-“链接。

它必须是本地化的,格式可能会根据本地的不同而改变。例如,美国人喜欢MonthName DayNumber年,而法国人喜欢DayNumber MonthName年。

我计划对这种格式进行编程,但我想知道它是否已经存在:)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-30 21:02:02

这很管用..。

代码语言:javascript
复制
function humanDateRanges($start, $end){
    $startTime=strtotime($start);
    $endTime=strtotime($end);

    if(date('Y',$startTime)!=date('Y',$endTime)){
        echo date('F j, Y',$startTime) . " to " . date('F j, Y',$endTime);
    }else{
        if((date('j',$startTime)==1)&&(date('j',$endTime)==date('t',$endTime))){
            echo date('F',$startTime) . " to " . date('F, Y',$endTime);
        }else{
            if(date('m',$startTime)!=date('m',$endTime)){
                echo date('F j',$startTime) . " to " . date('F j, Y',$endTime);
            }else{
                echo date('F j',$startTime) . " to " . date('j, Y',$endTime);
            }
        }
    }
}

humanDateRanges("2015-04-20", "2015-04-22");
//April 20 to 22, 2015
humanDateRanges("2015-04-01", "2015-05-31");
//April to May, 2015
humanDateRanges("2015-04-30", "2015-05-02");
//April 30 to May 2, 2015
humanDateRanges("2014-05-02", "2015-05-02");
//May 2, 2014 to May 2, 2015

但我确实认为,在某些情况下,即使是人类也需要被告知,四月至五月将从第一天开始,第三十一次结束。

票数 6
EN

Stack Overflow用户

发布于 2016-03-20 09:12:38

以防其他人偶然发现这个问题:我编写了一个小型库,试图以同样适用于国际化的方式解决这个问题:

https://github.com/flack/ranger

它应该为ltr语言提供一个合理的默认设置(而且rtl支持应该不会太难添加)

票数 4
EN

Stack Overflow用户

发布于 2019-12-13 00:35:35

这是一个试图针对每一个可能的地区的解决方案。

当然还有改进的余地。

看一下这个演示:https://www.tehplayground.com/JIrjclNy3jEoVrTJ

代码语言:javascript
复制
function format_dateRange($from, $to, $options=[]){
    if (!is_numeric($from)) $from = strtotime($from);
    if (!is_numeric($to)) $to = strtotime($to);

    $fromArr = explode('.',date('Y.n.j', $from));
    $toArr   = explode('.',date('Y.n.j', $to));

    $sameYear  = $fromArr[0] === $toArr[0];
    $sameMonth = $sameYear && $fromArr[1] === $toArr[1];
    $sameDay   = $sameMonth && $fromArr[2] === $toArr[2];


    $locale = $options['locale'] ?? setlocale(LC_ALL, 0);
    $dateType = $options['dateType'] ?? \IntlDateFormatter::LONG;
    $timeType = $options['timeType'] ?? \IntlDateFormatter::SHORT;
    $ignoreTime = $timeType === 'none' || ($timeType === 'optional' && !$sameDay);

    if ($timeType === 'optional') {
        $timeType = $sameDay ? \IntlDateFormatter::SHORT : \IntlDateFormatter::NONE;
    }

    $startFormatter = new \IntlDateFormatter($locale,$dateType,$timeType,null);
    $pattern = $startFormatter->getPattern();

    $timeSeparator = $options['timeSeparator'] ?? ' – '; 
    $daySeparator  = $options['daySeparator'] ?? ' – ';
    $dateSeparator = $options['dateSeparator'] ?? ' – ';

    if ($timeType === \IntlDateFormatter::NONE) {
        if ($sameMonth) { // include day-range
            preg_match("/(?<!['])dd?\.?/", $pattern, $matches);
            $partPattern = trim($matches[0]);
            $endFormatter = new \IntlDateFormatter($locale,$dateType,$timeType,null);
            $endFormatter->setPattern($partPattern);
            $endPart = $endFormatter->getPattern();
            $preg = "/".preg_quote($partPattern)."(?!e)/"; 
            $pattern = preg_replace($preg, $partPattern."'".$daySeparator.($endFormatter->format($to))."'", $pattern); 
        } else if ($sameYear) { // include day-month-range
            preg_match('/(d+.+M+|M+.+d+(?!\'))/', $pattern, $matches);
            $partPattern = $matches[0];
            $endFormatter = new \IntlDateFormatter($locale,$dateType,$timeType,null);
            $endFormatter->setPattern($partPattern);
            $endPart = $endFormatter->getPattern();
            $pattern = str_replace($partPattern, $partPattern."'".$daySeparator.($endFormatter->format($to))."'", $pattern);
        }
        // else just the pattern?
    } else {
        if ($sameDay) { // incluce time-range
            $endFormatter = new \IntlDateFormatter($locale,\IntlDateFormatter::NONE,$timeType,null);
            $endPart = $endFormatter->getPattern();
            $pattern = str_replace($endPart, $endPart."'".$timeSeparator.($endFormatter->format($to))."'", $pattern);
        } else { // append end-date
            $endFormatter = new \IntlDateFormatter($locale,$dateType,$timeType,null);
            $pattern .= "'".$dateSeparator.$endFormatter->format($to)."'";
        }
    }

    $startFormatter->setPattern($pattern);
    $str = $startFormatter->format($from);
    return $str;
}

$locales = ['af-ZA','am-ET','ar-AE','ar-BH','ar-DZ','ar-EG','ar-IQ','ar-JO','ar-KW','ar-LB','ar-LY','ar-MA','arn-CL','ar-OM','ar-QA','ar-SA','ar-SY','ar-TN','ar-YE','as-IN','az-Cyrl-AZ','az-Latn-AZ','ba-RU','be-BY','bg-BG','bn-BD','bn-IN','bo-CN','br-FR','bs-Cyrl-BA','bs-Latn-BA','ca-ES','co-FR','cs-CZ','cy-GB','da-DK','de-AT','de-CH','de-DE','de-LI','de-LU','dsb-DE','dv-MV','el-GR','en-029','en-AU','en-BZ','en-CA','en-GB','en-IE','en-IN','en-JM','en-MY','en-NZ','en-PH','en-SG','en-TT','en-US','en-ZA','en-ZW','es-AR','es-BO','es-CL','es-CO','es-CR','es-DO','es-EC','es-ES','es-GT','es-HN','es-MX','es-NI','es-PA','es-PE','es-PR','es-PY','es-SV','es-US','es-UY','es-VE','et-EE','eu-ES','fa-IR','fi-FI','fil-PH','fo-FO','fr-BE','fr-CA','fr-CH','fr-FR','fr-LU','fr-MC','fy-NL','ga-IE','gd-GB','gl-ES','gsw-FR','gu-IN','ha-Latn-NG','he-IL','hi-IN','hr-BA','hr-HR','hsb-DE','hu-HU','hy-AM','id-ID','ig-NG','ii-CN','is-IS','it-CH','it-IT','iu-Cans-CA','iu-Latn-CA','ja-JP','ka-GE','kk-KZ','kl-GL','km-KH','kn-IN','kok-IN','ko-KR','ky-KG','lb-LU','lo-LA','lt-LT','lv-LV','mi-NZ','mk-MK','ml-IN','mn-MN','mn-Mong-CN','moh-CA','mr-IN','ms-BN','ms-MY','mt-MT','nb-NO','ne-NP','nl-BE','nl-NL','nn-NO','nso-ZA','oc-FR','or-IN','pa-IN','pl-PL','prs-AF','ps-AF','pt-BR','pt-PT','qut-GT','quz-BO','quz-EC','quz-PE','rm-CH','ro-RO','ru-RU','rw-RW','sah-RU','sa-IN','se-FI','se-NO','se-SE','si-LK','sk-SK','sl-SI','sma-NO','sma-SE','smj-NO','smj-SE','smn-FI','sms-FI','sq-AL','sr-Cyrl-BA','sr-Cyrl-CS','sr-Cyrl-ME','sr-Cyrl-RS','sr-Latn-BA','sr-Latn-CS','sr-Latn-ME','sr-Latn-RS','sv-FI','sv-SE','sw-KE','syr-SY','ta-IN','te-IN','tg-Cyrl-TJ','th-TH','tk-TM','tn-ZA','tr-TR','tt-RU','tzm-Latn-DZ','ug-CN','uk-UA','ur-PK','uz-Cyrl-UZ','uz-Latn-UZ','vi-VN','wo-SN','xh-ZA','yo-NG','zh-CN','zh-HK','zh-MO','zh-SG','zh-TW','zu-ZA'];
$variants = [];
foreach ($locales as $locale) {
    $variant = format_dateRange(time(), time()+60*5, ['locale' => $locale, 'timeType' => 'optional']);
    $variants[$variant] = [
        'locale' => $locale,
        'sameday' => $variant,
        'samemonth' => format_dateRange(time()-60*60*13, time()+60*60*13, ['locale' => $locale, 'timeType' => 'optional']),
        'sameyear' => format_dateRange(time()-60*60*24*16, time()+60*60*24*16, ['locale' => $locale, 'timeType' => 'optional']),
    ];
}

echo '<table>';
foreach ($variants as $variant => $row) {
    echo 
    '<tr>'.
        '<td>'.$row['locale'].
        '<td>'.$row['sameday'].
        '<td>'.$row['samemonth'].
        '<td>'.$row['sameyear'];
}
echo '</table>';
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29976026

复制
相关文章

相似问题

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