ambroisemaupate / date-to-sentence
一个简单的分词器,用于打印可读的日期。
1.5.0
2023-07-20 22:30 UTC
Requires
- php: >=7.4
- ext-intl: *
- symfony/options-resolver: >=2.8
Requires (Dev)
- phpstan/phpstan: ^1.3.0
- phpunit/phpunit: ^8.5.20
- squizlabs/php_codesniffer: ^3.3
This package is auto-updated.
Last update: 2024-09-21 01:11:51 UTC
README
一个简单的分词器,用于打印可读的日期。
需求
- PHP 7.4 至少
- PHP-intl 扩展
可用分词器
- 英语
- 法语
- 德语
用法
composer require ambroisemaupate/date-to-sentence
use AM\Date2Sentence\EnglishDateLexer; $lexer = new EnglishDateLexer(); $lexer->setDates([ new DateTime('2017-06-01'), new DateTime('2017-06-02'), new DateTime('2017-06-03'), ]); echo $lexer->toSentence(); // "From June 1st to June 3rd" $lexer->setDates([ new DateTime('2017-06-01'), new DateTime('2017-06-02'), new DateTime('2017-06-03'), new DateTime('2017-06-10'), ]); echo $lexer->toSentence(); // "From June 1st to June 3rd and June 10th"
使用 wrap 选项
use AM\Date2Sentence\EnglishDateLexer; $nonContinuousLexer = new EnglishDateLexer([ new DateTime('2017-06-01'), new DateTime('2017-06-02'), new DateTime('2017-06-03'), new DateTime('2017-06-10'), ], ['wrap_format' => '<span>%s</span>']); echo $nonContinuousLexer->toSentence(); // "From <span>June 1st</span> to <span>June 3rd</span> and <span>June 10th</span>"
使用法语分词器
use AM\Date2Sentence\FrenchDateLexer; $lexer = new FrenchDateLexer([ new DateTime('2017-06-01'), new DateTime('2017-06-02'), new DateTime('2017-06-03'), ]); echo $lexer->toSentence(); // "Du 1er au 3 juin" $nonContinuousLexer = new FrenchDateLexer([ new DateTime('2017-06-01'), new DateTime('2017-06-02'), new DateTime('2017-06-03'), new DateTime('2017-06-10'), ]); echo $nonContinuousLexer->toSentence(); // "Du 1er au 3 juin et le 10 juin"
设置容差
在日期之前设置容差 以 改变日期列表的方式。即使某些日期缺失(例如周末),您也可以强制执行 from-to 写作。
use AM\Date2Sentence\EnglishDateLexer; $nonContinuousLexer = new EnglishDateLexer(); // Tolerate 1 missing day between dates. $nonContinuousLexer->setTolerance(1); $nonContinuousLexer->setDates([ new DateTime('2017-06-01'), // no 2nd new DateTime('2017-06-03'), // no 4th new DateTime('2017-06-05'), // no 6th new DateTime('2017-06-07'), ]); echo $nonContinuousLexer->toSentence(); // "From June 1st to June 7th"
按月分组
Date2Sentence 是为了将同一月份的日期分组,而不是重复月份名称。
use AM\Date2Sentence\EnglishDateLexer; $nonContinuousLexer = new EnglishDateLexer(); $nonContinuousLexer->setDates([ new DateTime('2017-06-01'), // no 2nd new DateTime('2017-06-03'), // no 4th new DateTime('2017-06-05'), // no 6th new DateTime('2017-06-07'), new DateTime('2017-07-01'), ]); echo $nonContinuousLexer->toSentence(); // "June 1st, 3rd, 5th, 7th and July 1st" // // In French, it works too… // "Les 1er, 2, 5, 7 juin et le 1er juillet"
获取小时
Date2Sentence 还可以从您提供的日期中提取时间。
use AM\Date2Sentence\EnglishDateLexer; $lexer = new EnglishDateLexer(); $lexer->setDates([ new DateTime('2017-06-01 20:00:00'), new DateTime('2017-06-03 21:00:00'), new DateTime('2017-06-05 20:00:00'), new DateTime('2017-06-07 21:00:00'), new DateTime('2017-07-01 20:00:00'), ]); echo json_encode(array_keys($this->getLexer()->getAvailableTimes())); // [ // "20:00", // "21:00" // ]
获取日期数组
如果您需要手动渲染日期组,您可以使用通用的 toArray
方法,该方法将起始和结束日期分组到数组中。同一数组中的日期是连续的,不同的数组表示它们不是连续的。
use AM\Date2Sentence\EnglishDateLexer; $lexer = new EnglishDateLexer(); $lexer->setDates([ new DateTime('2017-06-01 20:00:00'), new DateTime('2017-06-02 21:00:00'), new DateTime('2017-06-03 21:00:00'), new DateTime('2017-07-01 20:00:00'), new DateTime('2017-07-02 21:00:00'), new DateTime('2017-07-03 21:00:00'), ]); echo json_encode($this->getLexer()->toArray()); // [ // [ // {"date":"2017-06-01 20:00:00.000000","timezone_type":3,"timezone":"Europe\/Paris"}, // {"date":"2017-06-03 21:00:00.000000","timezone_type":3,"timezone":"Europe\/Paris"} // ], // [ // {"date":"2017-07-01 20:00:00.000000","timezone_type":3,"timezone":"Europe\/Paris"}, // {"date":"2017-07-03 21:00:00.000000","timezone_type":3,"timezone":"Europe\/Paris"} // ] // ]
获取星期几
Date2Sentence 还可以从您提供的日期中提取星期几,星期几将表示为它们的数字(1代表星期一,7代表星期日)并按顺序排列。
use AM\Date2Sentence\EnglishDateLexer; $lexer = new EnglishDateLexer(); $lexer->setDates([ new DateTime('2017-06-01'), new DateTime('2017-06-02'), new DateTime('2017-06-03'), new DateTime('2017-06-08'), new DateTime('2017-06-08'), ]); echo json_encode($this->getLexer()->getAvailableDaysOfWeek()); // [ // 4, // 5, // 6 // ]
测试
vendor/phpunit/phpunit/phpunit --bootstrap vendor/autoload.php test