popy/republican-calendar

0.1.0-beta 2018-03-04 20:02 UTC

This package is not auto-updated.

Last update: 2024-09-24 03:59:41 UTC


README

这是一个基于法国共和/革命历的popy/calendar实现,它是一个12个月、每月30天的日历,有5天(或闰年的6天)附加日,这些附加日受到了埃及日历的启发。

日期转换器不再受caarmen的工作的启发,但她的工作极大地帮助我理解了日期转换的所有困难。

日期转换处理时区和夏令时,这些时区和夏令时保持为常规的小时跳跃,与常规日期相同的小时/日期,这在一天中提供了一致性。

Build Status

其他日历

如前所述,革命历是基于埃及日历的,因此CalendarFactory有一个专门的buildEgyptian方法,用于初始化一个埃及日历,只需使用配置(但这仅使用popy/calendar包即可实现)。还可能添加一些埃及日历的变体。

  • 科普特
  • 埃塞俄比亚

目的

它作为示例/概念证明,以及沙盒。代码在这里测试,最终,如果它有效且这是popy/calendar接口的示例实现,同时也是一个沙盒(谁说垃圾)和改进实验室。大多数popy/calendar工具和接口都源于这个仓库。

用法

获取合适的共和历的最简单方法是使用可配置的工厂。

用法基本上与任何popy/php-calendar实现相同,只有少数添加。

  • X将输出天个体的名称
  • |分隔两个备选方案,第一个用于常规日期,第二个备选方案(如果存在),用于补充日。
<?php

use Popy\RepublicanCalendar\Factory\CalendarFactory;

$factory = new CalendarFactory();

$calendar = $factory->buildRepublican();

echo $calendar->format(new DateTime(), 'Y-m-d') . "\n";
echo $calendar->format(new DateTime(), 'l jS F y, X|F, X, y H:i:s') . "\n";

?>

计算方法

最初的日历定义在插入闰日的位置上有模糊的规则,在解决方案决定(或需要)之前就被放弃了。除了popy/calendar提供的计算器外,还有多个闰日计算器可用。

  • RommeOddLeapDay:包装任何计算器,但传输不同的年值,以确保闰年将匹配前20年的闰日。
  • RommeWithFixedLeapDay:包装任何计算器,将在前20年(与上述相同的原因)传输不同的年值,然后变为透明。

CalendarFactory将默认为RommeOddLeapDay/Modern配对。

<?php

use Popy\RepublicanCalendar\Factory\CalendarFactory;

$factory = new CalendarFactory();

$calendar = $factory->buildRepublican([
    // Lets use a better leap year calculator
    'leap' => 'futuristic',

    // Will wrap it with RommeWithFixedLeapDay
    'leap_wrapper' => 'fixed',
]);

echo $calendar->format(new DateTime(), 'Y-m-d');

?>

格式备选方案

popy/republican-calendar带来一个特殊的格式化程序,如果提供了格式备选方案,它将使用该格式备选方案来格式化埃及补充月份,使用|作为分隔符,类似于popy/calendar本地格式解析器的行为(这意味着相同的格式字符串可以用于格式化和解析日期,并将匹配两个备选方案)。

<?php

use Popy\RepublicanCalendar\Factory\CalendarFactory;

$factory = new CalendarFactory();

$calendar = $factory->buildRepublican();

$format = 'l jS F Y, X|F, X, Y';

// WIll output "Primidi 1e Vendémiaire 0001, Raisin"
echo $calendar->format(new DateTime('1792-09-22 00:00:00'), $format) . "\n";
// Will output "Sans-culottides, jour de la révolution, 0019"
echo $calendar->format(new DateTime('1811-09-23 00:00:00'), $format) . "\n";

// Will output 1792-09-22
echo $calendar->parse('Primidi 1e Vendémiaire 0001, Raisin', $format)
    ->format('Y-m-d') . "\n"
;
// Will output 1811-09-23
echo $calendar->parse('Sans-culottides, jour de la révolution, 0019', $format)
    ->format('Y-m-d') . "\n"
;
?>

时间格式

法国共和/革命历最初带有十进制时间格式(10h,100m,100s),正如埃及的启发一样,取代了十二进制格式(24h,60m,60s),但很快就放弃了,可能是因为更换全国每个时钟的难度和成本很高(因为当时,他们没有智能手表能够升级其应用程序。黑暗的时代。)

所以,根据你对革命的感受,你可以使用一种格式或另一种格式,通过注入适合你需要的TimeConvertor。

CalendarFactory将默认为实际的十进制表示。

趣闻:中国古代的时间系统将一天分为100个相等的部分(刻),每个部分为14分钟24秒,这非常接近我们的四分之一小时,并且完美匹配十进位时间系统中的10分钟。这不是一种互操作性吗?

<?php

use Popy\RepublicanCalendar\Factory\CalendarFactory;

$factory = new CalendarFactory();

$calendar = $factory->buildRepublican([
    'time_format' => $yourRevolutionaryLevel > 9000 ? 'decimal' : 'duodecimal',
]);

echo $calendar->format(new DateTime(), 'Y-m-d H:i:s');

?>