首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从unix-timestamp中以数学方式计算天数?

从unix-timestamp中以数学方式计算天数?
EN

Stack Overflow用户
提问于 2011-08-21 12:36:32
回答 3查看 12.7K关注 0票数 10

如何根据unix时间戳,以数学方式计算日期,而不使用任何函数和简单的数学公式。

1313905026 --> 8(今日08/21/2011)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-21 12:48:50

没有简单的公式可以做到这一点。您将需要减去自纪元以来的年数(考虑到闰年),这可能需要一个循环或某种离散计算。然后使用某种类型的循环来减去当前年份每个月的秒数。剩下的是当前进入该月的秒数。

我会做这样的事情。

代码语言:javascript
复制
x = ...//the number of seconds
year = 1970

while (x > /*one year*/){
 x = x - /*seconds in january, and march-december*/
 if(year % 4 == 0){
  x -= /*leapeay seconds in february*/
 }else{
  x -= /*regular seconds in february*/
 }
}

//Then something like this:

if(x > /*seconds in january*/){
 x -= /*seconds in january*/
}
if(x > /*seconds in february*/){
 x -= /*seconds in january*/
}

.
.
.

//After that just get the number of days from x seconds and you're set.

编辑

为简单起见,我建议使用日期函数,但这里有一个可能的非循环替代方案,以防有人需要它,或者希望进一步开发它。

首先,设t是自纪元以来的当前时间(秒)。

设F是四年中的秒数。这是三个正常的年份和一个闰年。应该是: 126230400。

现在,如果你去掉F贡献的所有时间,你会得到一个余数: y。

所以y=n%F。

现在有几种情况: 1. y小于一年2. y小于两年3. y小于三年且小于两个月4. y小于三年且大于两个月5. y小于四年

请注意,1972年是闰年,所以如果你从1970年开始加4,那么你停下来的地方就是两年后的闰年。

假设jan,feb,febLY,mar,may,...,dec是每个月的秒数(你需要计算出来)。

D表示当月的天数,D表示一天中的秒数(86400)。Y表示常规年份中的秒数,yLY表示闰年中的秒数。

代码语言:javascript
复制
y = (t % F)
if(y < Y){
 if(y > jan){
  y -= jan
 }
 if(y > feb){
  y -= feb
 }
 .
 .
 .
 d = y % D
}
else if(y < 2 * y){
 y = y - Y
 if(y > jan){
  y -= jan
 }
 if(y > feb){
  y -= feb
 }
 .
 .
 .
 d = y % D
}
else if(y < 2 * y + yLY){
 y = y - 2 * Y
 if(y > jan){
  y -= jan
 }
 if(y > febLY){
  y -= febLY
 }
 .
 .
 .
 d = y % D
}
else{
 y = y - 2 * Y - yLY
 if(y > jan){
  y -= jan
 }
 if(y > feb){
  y -= feb
 }
 .
 .
 .
 d = y % D
}

未测试。此外,由于地球的自转速度不是精确到一周/ 24小时,他们偶尔会对时间进行调整。你需要做一些研究,把这些因素考虑进去。

票数 3
EN

Stack Overflow用户

发布于 2017-03-16 15:29:45

代码语言:javascript
复制
t = unix time
second = t MOD 60  
minute = INT(t / 60) MOD 60  
hour = INT(t / 60 / 60) MOD 24  
days = INT(t / 60 / 60 / 24)  
years = INT(days / 365.25)  
year = 1970 + years + 1

1970以星期四开始,所以我们可以计算一周中的第几天:

代码语言:javascript
复制
weekday = (days + 4) MOD 7

如果星期天是第0天。如果你希望周日是第一天,只需加1即可。

现在,让我们来看看我们进入这一年有多少天了。

代码语言:javascript
复制
days = days - years * 365 - leapdays

最后,我们找到该月的月份和日期。

代码语言:javascript
复制
IF year MOD 4 = 0 THEN ly = 1 ELSE ly = 0
WHILE month <= 12
    month = month + 1
    IF month = 2 THEN
        DaysInMonth = 28 + NOT(year MOD 4) + NOT(year MOD 100)
            + NOT(year MOD 400)
    ELSE
        DaysInMonth = 30 + (month + (month < 7)) MOD 2
    END IF
    IF days > DaysInMonth THEN days = days - DaysInMonth
END WHILE

假设布尔值为TRUE = 1、FALSE = 0、NOT TRUE = 0和NOT FALSE = 1。

现在我们有了年、月、月中的日、小时、分钟和秒,并对闰年进行了调整。

票数 2
EN

Stack Overflow用户

发布于 2021-03-12 13:16:35

在rust中:

代码语言:javascript
复制
fn date(mut months_to_shift: i32, timezone_shift: i32) -> String {
    months_to_shift = months_to_shift * 2_628_000;

    let timestamp = SystemTime::now()
    .duration_since(UNIX_EPOCH)
    .expect("Before time!")
    .as_secs() as f32;

    let adjusted_time = ((((timestamp / 31_557_600.0) / 4.0).round() as i32 * 86_400)
        + 604800
        + (timezone_shift * 3600)
        + months_to_shift) as f32
        + timestamp; // 608400 offset for number of days missing - 7 - (???) + leap year days +/- timezone shift from EST -- Using timezone shift in my project but not necessary

    let years = (1970.0 + (adjusted_time / 31_536_000.0)) as i32;

    let mut months = ((adjusted_time % 31_536_000.0) / 2_628_000.0) as i32;
    months = if months == 0 { 12 } else { months };

    let days = ((adjusted_time % 2_628_000.0) / 86_400.0) as i32;

    years.to_string() + "-" + &months.to_string() + "-" + &days.to_string()
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7136385

复制
相关文章

相似问题

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