我正在编写一个 java 程序,根据用户输入打印自 1970 年 1 月 1 日以来的毫秒、秒或天数或当前日期。我已经全部写好了,但由于某种原因它无法执行,我真的很困惑为什么。我很确定这与
Date
类有关。我正确导入了吗?我是java新手,所以任何帮助将不胜感激。
package com.company;
import java.util.Date;
public class Main {
public static void main(String[] args) {
//get string args
String input = args[0];
//parse ints from string
int command = Integer.parseInt(input);
Date structDate = new Date();
long milliseconds = structDate.getTime();
long seconds = milliseconds / 1000;
long days = seconds / 86400;
switch (command) {
case 0:
System.out.println("milliseconds since January 1, 1970:" + milliseconds);
break;
case 1:
System.out.println("seconds since January 1, 1970:" + seconds);
break;
case 2:
System.out.println("days since January 1, 1970:" + days);
break;
case 3:
System.out.println("current Date and Time:" + structDate);
break;
}
}
}
您正在使用有严重缺陷的
java.util.Date
类。这是遗留的日期时间类之一,被 JSR 310 中定义的现代 java.time 类取代。
要捕获与 UTC 零小时-分钟-秒的偏移所看到的当前时刻,请使用
java.time.Instant.now()
。
Instant instant = Instant.now() ;
你问:
根据用户输入打印自 1970 年 1 月 1 日以来的毫秒、秒或天数或当前日期。
该类表示自 1970 UTC (1970-01-01T00:00Z) 的第一个时刻以来,以整秒计数的时刻,加上以纳秒计数的小数秒。要将计数提取为毫秒:
long millisecondsSince1970Utc = instant.toEpochMilli() ;
请注意上面那行数据丢失。您忽略了该
Instant
对象中可能包含的任何微秒和纳秒。
要获取自 UTC 1970 年第一时刻以来的整秒数:
long secondsSince1970Utc = instant.getEpochSecond() ;
再次,由于我们忽略了该
Instant
对象中可能存在的毫秒、微秒和纳秒,因此可能会丢失数据。
还要注意 java.time API 中的少数缺陷之一:该
getEpochSecond
方法应该被命名为 toEpochSecond
。作为一个 getter,该名称不必要地揭示了一个实现细节,即整秒计数存储在该对象内。
获取天数更为复杂。您所说的“天”是指 24 小时的时间段吗?或者您指的是年月历中的“天”?
对于 24 小时块的计数,请使用
Duration
类。此类表示不附加到时间线的时间跨度。
Duration d = Duration.between( Instant.EPOCH , instant ) ;
要求计算 24 小时的时间段。
long chunksOf24HoursSinceStartOf1970Utc = d.toDays() ;
对于日历天数的计算,我们必须应用时区。对于任何特定时刻,全球各地的日期因时区而异。日本东京是“明天”,而美国俄亥俄州托莱多则是“昨天”。
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
将该时区应用于我们的
Instant
对象以获取 ZonedDateTime
对象。
ZonedDateTime zdt = instant.atZone( z ) ;
现在我们可以通过
Period
类获取已过去的日历天数。
Period p = Period.between( Instant.EPOCH.atZone( z ) , zdt ) ;
int calendarDaysSinceStartOf1970Utc = p.getDays() ;
要查看有关这些主题的类似报道,请参阅我的其他答案。