2

鉴于:

private Calendar calendarInstance = Calendar.getInstance();

public long inMillis() {
    calendarInstance.set(year, month, day, hour, min);
    return calendarInstance.getTimeInMillis();
}

据我了解,结果会随着纪元以来的时间回来,以毫秒为单位

当前时间(从纪元开始的 UTC 毫秒)。

鉴于我的测试总是将对象设置为相同,为什么随着时间的推移结果会有所不同?

detailedMoment = new MomentInTime(2012, 11, 1, 19, 9);
detailedMoment.inMillis() // gives different results as time passes by

更新:

我继续猜测自己是因为 在此处输入图像描述

在同一时间段内,我得到

1_351_796_940 // http://www.epochconverter.com
1_354_410_540 // my number
4

4 回答 4

2

那么你不设置秒或毫秒。 JavaDoc说:

设置年、月、月中的某一天、一天中的小时和分钟字段。 其他字段不变。

于 2012-11-01T19:57:31.530 回答
2

我认为你应该使用clear()。如果您这样做,它将每次返回您确切的毫秒数。

public long inMillis() {
    calendarInstance.clear();
    calendarInstance.set(year, month, day, hour, min);
    return calendarInstance.getTimeInMillis();
}

来自 Java 文档

设置此日历的所有日历字段值和时间值(millisecond offset from the Epoch)未定义。这意味着 isSet() 将为所有日历字段返回 false,并且日期和时间计算会将这些字段视为从未设置过的字段。日历实现类可以使用其特定的默认字段值进行日期/时间计算。例如,1970如果 YEAR 字段值未定义,则使用 GregorianCalendar。

示例程序

public class MomentInTime {

private static Calendar calendarInstance = Calendar.getInstance();

public static long inMillis() {
    calendarInstance.clear();
    calendarInstance.set(2012, 10, 1, 19, 9);
    return calendarInstance.getTimeInMillis();
}

public static void main(String[] args) throws InterruptedException {
    for (int i = 0; i < 10; i++) {
        System.out.println(inMillis()/1000);
        Thread.sleep(300);
    }
}
}

输出:

 1351777140

在此处输入图像描述

于 2012-11-01T19:57:40.123 回答
1

我猜那是因为您缺少Calendar.getInstance() 的秒数毫秒数。

您只是替换year, month, day, hour, minCalendar 对象,但每次获取日历实例时,该特定时间点的秒数和毫秒数可能会发生变化。

于 2012-11-01T19:56:46.303 回答
1

java.time

java.util日期时间 API 及其格式化 API已SimpleDateFormat过时且容易出错。建议完全停止使用它们并切换到现代 Date-Time API *

使用java.time现代日期时间 API 的解决方案:

import java.time.LocalDate;
import java.time.ZoneOffset;

public class Main {
    public static void main(String[] args) {
        //Test
        System.out.println(inMillis(2021,6,19,8,30));
    }
    public static long inMillis(int year, int month, int day, int hour, int min) {
        return LocalDate.now()
                .atStartOfDay(ZoneOffset.UTC)
                .withYear(year)
                .withMonth(month)
                .withDayOfMonth(day)
                .withHour(hour)
                .withMinute(min)
                .toInstant()
                .toEpochMilli();
    }
}

输出:

1624091400000

ONLINE DEMO

这是http://www.epochconverter.com的显示方式:

在此处输入图像描述

从Trail: Date Time了解有关现代日期时间 API 的更多信息。

更新:

一个更简单的版本(感谢 Ole VV):

public static long inMillis(int year, int month, int day, int hour, int min) {
    return OffsetDateTime.of(year, month, day, hour, min, 0, 0, ZoneOffset.UTC)
            .toInstant()
            .toEpochMilli();
}

* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

于 2021-06-19T07:33:45.830 回答