【问题标题】:How to determine if a timestamp is within working hours?如何确定时间戳是否在工作时间内?
【发布时间】:2011-09-04 00:55:02
【问题描述】:

给定一个转换为 26.05.2011 08:00:01 的任何 unix 时间戳(即 1306396801),我如何确定这是否在给定的时间范围内(即 08:00:00 和 16:00:00)?

这需要在任何一天都有效。我只想知道这个时间戳是否在给定的时间间隔内,在任何未来(或过去)的日子里,日期都不重要。我不在乎是25号还是26号,只要在08:00到16:00之间就可以了。

我正在寻找一个 java 解决方案,但是任何可以工作的伪代码都可以,我只是转换它。

到目前为止,我的尝试一直是将其转换为 java 日历,读取小时/分钟/秒值并进行比较,但这只是打开了一大堆蠕虫。如果我想要的时间间隔是 16.30,我不能只检查 tsHour > frameStartHour && tsMin > frameStartMin,因为这将丢弃任何一分钟 > 30 的时间戳。

谢谢你看这个:)

澄清一下。 我只是使用和引用 UTC 时间,我的时间戳是 UTC,我想要它的范围是 UTC。

【问题讨论】:

  • 在哪个时区?客户端的本地时区?你使用夏令时吗?
  • 我使用的是 UTC(又名 GMT)
  • 感谢所有建议,我会做一些测试,看看情况如何:)

标签: java timestamp


【解决方案1】:

我想我明白你想要什么。如果在 UTC 上午 8 点到下午 4 点之间,您想测试任何一天。取时间戳 mod 24*3600。这将为您提供一天中经过的秒数。然后你只需比较它在 8*3600 和 16*3600 之间。如果您需要处理时区,事情会变得更加复杂。

【讨论】:

  • 谢谢你,为我的问题提供了一个非常巧妙的解决方案!
【解决方案2】:

如果我理解正确,您只需将日期标准化为某个共同值。创建三个日历实例 - 一个包含您的时间,但将日、月和年设置为零,另外两个包含您的时间范围的开始和结束,其他字段也归零。然后可以使用 Calendar.after() 和 Calendar.before() 来查看日期是否在范围内。

【讨论】:

  • 我对此进行了一些测试,但使用日历我得到了不一致的结果。即使我将所有内容都设置为 0,它也没有给我任何我可以使用的东西。我最终检查了每个值。
【解决方案3】:

根据您的时间戳(以秒为单位)和所需的时区,Jodatime 会为您提供小时,从而引导您进行简单的整数范围检查。

new org.joda.time.DateTime(timestamp*1000L, zone).getHourOfDay()

使用 java.util.* 更难。

【讨论】:

  • 这是唯一/最好的解决方案吗?
  • 嗯,它只是 (hour>=8) && (hour
  • 好吧,遗憾的是,我最终这样做了。在将某些字段设置为零时,也许 jodatime 得到了一些更一致的 Calendar.after() ,但我没有尝试过。一路蛮力……:P
  • 这样做了2个小时后,我回来找到了mod解决方案!
  • 这看起来不像是需要 3rd 方库的任务类型。
【解决方案4】:

将范围的开头转换为 unix 时间戳,将范围的结尾转换为 unix tmestamp,然后这是一个简单的整数检查。

【讨论】:

  • 是和不是。如果我只想这样做 1 天,那简直是小菜一碟。但这不是我想要的,如果这个时间戳在设定的时间间隔之间有一小时和一分钟,我想得到“真”。
【解决方案5】:

您的 unix 时间戳是一个绝对时间。你的时间框架是相对的。您需要某种时区信息才能解决此问题。我只是在几分钟前answered some of this for PostgreSQL。希望这篇文章有用。

【讨论】:

  • 好的,我想我得到了关于相对时间的部分,但我的时间戳和我想要的小时/分钟/秒范围都是 UTC。
猜你喜欢
  • 2017-01-11
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 2013-09-25
相关资源
最近更新 更多