秒到年

2023-12-24

基本上,我正在尝试重新创建 PHP 日期的年份功能。使用自 1970 年 1 月 1 日以来的秒数,我试图在不使用内置函数的情况下获取年份。我有一个想法,但由于闰年而没有实现。谁能给我一个可行的公式,从 1970 年开始计算秒数并计算出一年?


要找到年份,您需要处理跳跃问题。

从 1 开始的年份按 4 年为一组进行排序,最后一天多了一天,对吗?所以你有以下块:

seconds_block = 365*3 + 366 days = 126230400 seconds
seconds_year = 365 days = 31536000 seconds

1970 年是该区块的第二年,因此:

<?php 
//test_year.php   
$given_seconds = $argv[1];

$seconds_year = 31536000;
$seconds_block = 126230400;
$total_blocks_to_1968 = 492;
$actual_block = floor((($given_seconds + $seconds_year) / $seconds_block)) + $total_blocks_to_1968;
$actual_offset_from_last_block = ($given_seconds + $seconds_year) % $seconds_block;
$actual_year_of_the_block = min(floor($actual_offset_from_last_block / $seconds_year) + 1, 4);
$actual_year = $actual_block * 4 + $actual_year_of_the_block;
echo $actual_year;

测试一下...

$ php test_year.php 0
1970
$ php test_year.php 1
1970
$ php test_year.php -1
1969
$ php test_year.php 31536000
1971
$ php test_year.php 31535999
1970
$ php test_year.php 126230400
1974
$ php test_year.php 126230399
1973

更多的: 如果能被 4 整除,一年就是闰年,能被 100 整除的除外(但不能被 400 整除)。

function isLeap(year){
    return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)
}

EDIT:伪代码公式

x = input // number of seconds since 1970

sy = 31536000  // seconds a non leap year
sb = 126230400  // seconds a block of 3 non leap years and one that is

actual_year = (floor(((x + sy) / sb)) + 492) * 4 + 
              (min(floor(((x + sy) % sb) / sy) + 1, 4));

Cheers

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

秒到年 的相关文章

随机推荐