我正在尝试检索当天午夜的unix时间戳。时区不相关。我正在寻找类似于:1625716800的内容。我找到的每个教程都是用于检索格式化字符串的,例如:“thu jul 08 2021 04:00:00”它需要是午夜。不仅仅是当前的秒或毫秒。任何建议都将不胜感激。非常感谢。
h7appiyu1#
我正在尝试检索当天午夜的unix时间戳。时区不相关。这是不可能的。unix时间戳空间中不存在“一天”的概念。这个空间每经过一毫秒就有一个单位在滴答作响,因为有一个普遍定义的纪元(在unix空间中,这个纪元发生在那个时刻,当时英国格林威治的某个人会告诉你,现在正是1970年1月1日午夜)。在这个系统中没有天数,没有日期。只是“从大纪元开始的百万”,这就是你得到的。如果你想要像“天”、“月”或“小时”这样的概念,你根本无法在这个空间中做到这一点;这些都是人类的概念,你无法知道正确答案是什么,除非你涉及到一个政治单位,它决定如何将这样一个时代转化为一个实际的“今年这个月的这个日期,这个小时,这个分钟,等等”。政治单位有时区、夏令时等等——它们都在“午夜”时生效。欧洲/阿姆斯特丹是午夜,而亚洲/新加坡不是午夜。希望这能帮助你理解“午夜”这个概念是没有意义的,除非你加上一些“在哪里”的概念。可以是“系统认为它在哪里”(例如平台默认时区),可以是虚拟的utc时区,可以是某个特定时区,可以是用户指定的时区。但一定是在某个时区。此外,“当前日期”是模棱两可的。除非涉及时区,否则这也不是一件事。今天在哪里?阿姆斯特丹?新加坡?洛杉矶?正如我所说,米利斯从大纪元开始就不知道“天”是什么意思。它只知道纪元是什么时候,一毫秒是什么,它只知道别的什么。事实上,“午夜”根本不起作用。它可能不存在。大多数地方会将时钟提前一小时,如果他们真的这样做的话,在凌晨2点,但不是所有地区都这样做。因此,午夜可能只是一个从未有过的时刻。现在是3月22日23:59:59。下一个时刻是3月23日01:00:00。大概你真正的意思是“一天的开始”,例如,时间上的第一个瞬间,在确定的时区中可以称为“日期现在是x”。通常是00:00:00,但也有一些非常奇特的情况。问题是,“极端异国情调”并不等于“从未发生”。假设与“当天”和“当天开始”相关的区域都来自同一区域,那么您要寻找的是:
ZoneId zone = ....; ZonedDateTime zdt = ZonedDateTime.now(zone); zdt = zdt.toLocalDate().atStartOfDay(zone); long v = zdt.toInstant().toEpochMilli();
这里有很多东西。例如 ZoneOffset.UTC 或 ZoneId.systemDefault() 或 ZoneId.of("Europe/Amsterdam") 例如让我们试一下 ZoneOffset.UTC :
ZoneOffset.UTC
ZoneId.systemDefault()
ZoneId.of("Europe/Amsterdam")
ZoneId zone = ZoneOffset.UTC; ZonedDateTime zdt = ZonedDateTime.now(zone); zdt = zdt.toLocalDate().atStartOfDay(zone); long v = zdt.toInstant().toEpochMilli(); System.out.println(v);
请在ideone.com上查看此代码的实时运行:1625702400000
btqmn9zl2#
import java.util.Calendar; class test{ public static void main(String[] args) { Calendar cal = Calendar.getInstance(); cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE), 0, 0, 0); System.out.println(cal.getTimeInMillis()); } }
2条答案
按热度按时间h7appiyu1#
我正在尝试检索当天午夜的unix时间戳。时区不相关。
这是不可能的。unix时间戳空间中不存在“一天”的概念。这个空间每经过一毫秒就有一个单位在滴答作响,因为有一个普遍定义的纪元(在unix空间中,这个纪元发生在那个时刻,当时英国格林威治的某个人会告诉你,现在正是1970年1月1日午夜)。在这个系统中没有天数,没有日期。只是“从大纪元开始的百万”,这就是你得到的。
如果你想要像“天”、“月”或“小时”这样的概念,你根本无法在这个空间中做到这一点;这些都是人类的概念,你无法知道正确答案是什么,除非你涉及到一个政治单位,它决定如何将这样一个时代转化为一个实际的“今年这个月的这个日期,这个小时,这个分钟,等等”。政治单位有时区、夏令时等等——它们都在“午夜”时生效。
欧洲/阿姆斯特丹是午夜,而亚洲/新加坡不是午夜。希望这能帮助你理解“午夜”这个概念是没有意义的,除非你加上一些“在哪里”的概念。可以是“系统认为它在哪里”(例如平台默认时区),可以是虚拟的utc时区,可以是某个特定时区,可以是用户指定的时区。但一定是在某个时区。
此外,“当前日期”是模棱两可的。除非涉及时区,否则这也不是一件事。今天在哪里?阿姆斯特丹?新加坡?洛杉矶?正如我所说,米利斯从大纪元开始就不知道“天”是什么意思。它只知道纪元是什么时候,一毫秒是什么,它只知道别的什么。
事实上,“午夜”根本不起作用。它可能不存在。大多数地方会将时钟提前一小时,如果他们真的这样做的话,在凌晨2点,但不是所有地区都这样做。因此,午夜可能只是一个从未有过的时刻。现在是3月22日23:59:59。下一个时刻是3月23日01:00:00。大概你真正的意思是“一天的开始”,例如,时间上的第一个瞬间,在确定的时区中可以称为“日期现在是x”。通常是00:00:00,但也有一些非常奇特的情况。问题是,“极端异国情调”并不等于“从未发生”。
假设与“当天”和“当天开始”相关的区域都来自同一区域,那么您要寻找的是:
这里有很多东西。例如
ZoneOffset.UTC
或ZoneId.systemDefault()
或ZoneId.of("Europe/Amsterdam")
例如让我们试一下
ZoneOffset.UTC
:请在ideone.com上查看此代码的实时运行:
1625702400000
btqmn9zl2#