java中的日期类

问题描述 投票:0回答:1

我正在编写一个 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 date epoch
1个回答
0
投票

避免遗留日期时间类

您正在使用有严重缺陷的

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小时区块

对于 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() ;

要查看有关这些主题的类似报道,请参阅我的其他答案

© www.soinside.com 2019 - 2024. All rights reserved.