datetime - 如何手动从时间戳中提取一天中的小时数?

标签 datetime timestamp

不,我不想用任何特定的语言来做这件事。如果您只有数学知识,是否可以从时间戳中提取一天中的小时数?如果可以,如何提取?

例子

这是一个示例时间戳 1602934899。预期输出(该时间戳中的 小时)是 11

编辑

我试图在没有任何库的情况下完成此任务。另外,我知道闰秒,我不关心如果出于我的目的而忽略它可能导致的精度不足。我也不关心闰年、时区或夏令时。

最佳答案

tl;dr

( 1_602_934_899L % 86_400 ) / 3_600 

11

详情

Here's a sample timestamp 1602934899

用于跟踪日期时间值的此类数字通常是整秒、毫秒、微秒、纳秒、数百微秒或类似粒度的计数。

时间计数是自任意 epoch reference point 以来耗时。 . couple dozen such points已被各种成功的计算平台使用。一个更常见的引用点是许多面向 Unix 的系统使用的引用点,UTC 中 1970 年的第一个时刻,1970-01-01T00:00Z。 “在 UTC 中”是指与 UTC 的零小时-分钟-秒的偏移量。

您的数字 1602934899 很可能是自该纪元引用点以来的整秒计数。但不要猜测!请询问您的数据发布者,以确保他们选择的纪元引用点。

timeline diagram showing epoch reference point of 1970-01-01T00:00Z, a point of 1,602,934,899 seconds, and the current moment of 2021-06-12T04:52:40.982078Z

确定纪元引用后,进行数学计算。您可以将一天视为恰好 24 小时,因此 60 * 60 * 24 是每天的秒数。将您的输入除以该数字即可得出已经过去的整天数。余数给你最后一天的分数。您需要对余数进行数学运算以获得一天中的时间,除以得到小时、分钟和秒。

因为您只询问了小时数,所以就足够了。由于必须考虑闰年,因此获取日期需要更多工作。但是你的问题陈述只问了几个小时,所以日期是无关紧要的。

闰秒与您的计算无关。每隔几年进行一次闰秒的目的是让时钟慢一点,以便使我们对地球自转(一天中的时间)的跟踪与我们对地球绕太阳自转(年和日,日期)的跟踪同步,使用整洁的正好 60 * 60 * 24 秒的包。因此时钟上的闰秒注定要被日历吞没。

顺便说一下,自行处理日期时间通常是不明智的。日期时间是一个非常棘手的主题。因此,使用适当设计的日期时间框架(例如 Java 中的 java.time 类)是明智的。然而,在您的评论中,您指出了您工作中的异常和极端需求,因此您自己进行此计算可能是合理的。

首先,让 java.time 使用 Java 完成工作语言。

// The easy way.
Instant instant = Instant.ofEpochSecond( 1_602_934_899L ) ;
int h = instant.atOffset( ZoneOffset.UTC ).getHour() ;
Duration d = Duration.between( Instant.EPOCH , instant ) ;

System.out.println( instant ) ;
System.out.println( h ) ;
System.out.println( d ) ;
System.out.println( d.toDaysPart() + " days, " +  d.toHoursPart() + " hours, " + d.toMinutesPart() + " minutes, " +  d.toSecondsPart() + " seconds, " +  d.toNanosPart() + " nanos." ) ;

查看此 code run live at IdeOne.com .

2020-10-17T11:41:39Z
11
PT445259H41M39S
18552 days, 11 hours, 41 minutes, 39 seconds, 0 nanos.

现在,让我们来处理这些数字,同样使用 Java。

// The hard way.
long days = ( 1_602_934_899L / ( 60 * 60 * 24 ) ) ;
long secondsInPartialDay = ( 1_602_934_899L % ( 60 * 60 * 24 ) ) ;  // The percent-sign "%" means modulo in Java.
long hour = ( secondsInPartialDay / ( 60 * 60 ) ) ;

查看此 code run live at IdeOne.com .

days = 18552
secondsInPartialDay = 42099
hour = 11

或者更简洁:

( 1_602_934_899L % ( 60 * 60 * 24 ) ) / ( 60 * 60 )

如果您的编译器没有优化掉乘法,请替换为他们的产品以自己进行优化。

关于datetime - 如何手动从时间戳中提取一天中的小时数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67943550/

相关文章:

XML Hive Serde 提取时间戳 Hadoop

ruby - 迭代字符串数组并执行正则表达式

mysql - 比较 MySQL 中的两个时间戳

c# - 将时间戳添加到 Trace.WriteLine()

mysql - MySQL查询查找重复时间戳

java - 进程 fork 、子进程等[Java]

mysql - 如何将日期字符串 "yyyy-mm-ddThh:mm:ssZ"转换为时间戳

java - 在 JodaTime 中创建特定时区的日期时间对象

javascript - 两个文本框日期不应大于 JavaScript 中的当前日期

java - 日期格式解析错误