java:unix午夜时间戳

j2cgzkjk  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(463)

我正在尝试检索当天午夜的unix时间戳。时区不相关。我正在寻找类似于:1625716800的内容。我找到的每个教程都是用于检索格式化字符串的,例如:“thu jul 08 2021 04:00:00”它需要是午夜。不仅仅是当前的秒或毫秒。任何建议都将不胜感激。非常感谢。

h7appiyu

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.UTCZoneId.systemDefault()ZoneId.of("Europe/Amsterdam") 例如
让我们试一下 ZoneOffset.UTC :

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

btqmn9zl

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());
    }
}

相关问题