如何每隔一天自动获取 Unix 时间戳?
Posted
技术标签:
【中文标题】如何每隔一天自动获取 Unix 时间戳?【英文标题】:How can I get Unix Timestamp automatically for every next day? 【发布时间】:2021-12-18 10:24:16 【问题描述】:我需要为每个第二天的特定时间生成以毫秒为单位的 Unix 时间戳。
例如: 今天是 2021 年 4 月 11 日 09:00:00,那么时间戳是:1636002000000
明天我需要 2021 年 5 月 11 日 09:00:00
后天6/11/2021 09:00:00
等等……
那么如何在 Java 中获得自动生成的时间戳?
【问题讨论】:
你需要这个做什么? 长历元 = System.currentTimeMillis()/1000;以秒为单位返回纪元。 epochconverter.com Unix Epoch 于 1970 年 1 月 1 日,UTC java.util.Date 从这个日期开始,而不是在 0 年 0 日 0 分钟。所以使用 Duration 或 Period 进行 java.time 调整windsolarhybridaustralia.x10.mx/… @ThorbjørnRavnAndersen 我正在开发每天早上 9 点从 api 获取数据的应用程序。我是编程新手 这听起来像是您操作系统中的调度程序可以帮助您。 【参考方案1】:java.time
与 Samuel Marchant 一样,我建议您使用现代 Java 日期和时间 API java.time 来处理日期和时间。
如果您希望每天 9 点,请先将其定义为常量:
private static final LocalTime TIME = LocalTime.of(9, 0);
现在您的毫秒值可以通过这种方式获得:
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.systemDefault()).with(TIME);
for (int i = 0; i < 10; i++)
long timestampMillis = zdt.toInstant().toEpochMilli();
System.out.format("%-30s %13d%n", zdt, timestampMillis);
zdt = zdt.plusDays(1);
我刚才运行代码时的输出:
2021-11-11T09:00+01:00[Europe/Paris] 1636617600000 2021-11-12T09:00+01:00[Europe/Paris] 1636704000000 2021-11-13T09:00+01:00[Europe/Paris] 1636790400000 2021-11-14T09:00+01:00[Europe/Paris] 1636876800000 2021-11-15T09:00+01:00[Europe/Paris] 1636963200000 2021-11-16T09:00+01:00[Europe/Paris] 1637049600000 2021-11-17T09:00+01:00[Europe/Paris] 1637136000000 2021-11-18T09:00+01:00[Europe/Paris] 1637222400000 2021-11-19T09:00+01:00[Europe/Paris] 1637308800000 2021-11-20T09:00+01:00[Europe/Paris] 1637395200000
与您自己的答案中的代码相比,请不仅享受阅读代码的简单程度,而且首先要享受阅读代码更自然的程度。与 Java 1.0 和 1.1 中设计不佳的旧类相比,这是 java.time 的典型特征。
链接
Oracle Tutorial: Date Time 解释如何使用 java.time。
【讨论】:
【参考方案2】:在 Linux 中,您可以让 Chron 启动一个可以在某处写入的类,然后在检查流已写入后退出。你会要求它提前 30 秒左右开始,然后班级会寻找写入文件的时刻,然后自行退出。 使用 java,对于 UNIX 时间戳,java,time.Clock 需要为 UTC。
你会在课堂上使用这样的作品
// static Clock fixed(Instant fixedInstant, ZoneId zone) note Clock.Instant
Clock uxtmptmp = Clock.systemUTC();
// not sure of the behaviour of java.time.Clock.tick() tick(Clock baseClock, Duration tickDuration) - note Clock.millis()
Instant instxstmp = Instant.now(uxtmptmp);
//...
long uxepo = instxstmp.getEpochSecond();
【讨论】:
【参考方案3】:我找到了解决方案。
首先,我得到了当前的日期、月份和年份:
Calendar calendar = Calendar.getInstance();
int day = calendar.get(Calendar.DAY_OF_MONTH);
int month = calendar.get(Calendar.MONTH)+1;
int Year = calendar.get(Calendar.YEAR);
其次,我使用了StringBuilder
,将时间部分设置为上午 09:00:
StringBuilder s1 = new StringBuilder()
.append(day).append("/")
.append(month).append("/")
.append(Year).append(" ")
.append("09").append(":").append("00");
第三,我解析得到todayTimeStamp
:
todayTimeStamp = new SimpleDateFormat("dd/MM/yyyy HH:mm")
.parse(String.valueOf(s1)).getTime();
【讨论】:
这是一个糟糕的解决方案。Calendar
和 SimpleDateFormat
类设计不佳且早已过时,后者尤其是出了名的麻烦。没有人应该想使用它们。改用ZonedDateTime
和java.time, the modern Java date and time API, 中的其他类。以上是关于如何每隔一天自动获取 Unix 时间戳?的主要内容,如果未能解决你的问题,请参考以下文章
如何在每隔一天或每隔一天安排一次 UILocalNotification?
IIS每隔一段时间就无法进行访问,重启服务也不行,必须重启服务器才可以,请问是啥情况?如何解决?