Android Java:当前时间和未来特定时间之间的差异计算错误

Posted

技术标签:

【中文标题】Android Java:当前时间和未来特定时间之间的差异计算错误【英文标题】:Android Java : Difference between current time and specific time in future is calculated wrong 【发布时间】:2022-01-21 13:45:02 【问题描述】:

我需要当前时间和未来特定时间之间的差异,以便我可以将倒数计时器作为参数传递。我有这个操作的功能,但它计算错误。 这是我计算差异的函数

   public Date RetriveLeftTime(Date incomingTime) 

    DateFormat milisFormat = new SimpleDateFormat("HH:mm:ss");
    Date moment = Calendar.getInstance().getTime();
    milisFormat.format(moment);
    Date configuredTime = ConfigureTime(incomingTime);
    milisFormat.format(configuredTime);
    long leftTime =configuredTime.getTime()-moment.getTime();

    Date result = new Date(leftTime);
    result = ConfigureTime(result);

    Log.d("Result",result.toString());

    return result;


用于配置日期详细信息的 ConfigureTime() 函数

public Date ConfigureTime(Date date)

    Calendar today = Calendar.getInstance();
    int date = today.get(Calendar.DATE);
    int year = today.get(Calendar.YEAR);
    int day = today.get(Calendar.DAY_OF_WEEK);
    int month = today.get(Calendar.MONTH);
    int zone = today.get(Calendar.ZONE_OFFSET);

    Calendar time = Calendar.getInstance();
    time.setTime(date);

    time.set(Calendar.YEAR, year);
    time.set(Calendar.MONTH, month);
    time.set(Calendar.DAY_OF_WEEK, day);
    time.set(Calendar.DATE, date);
    time.set(Calendar.ZONE_OFFSET,zone);

    Log.d("ConfigureTime()",time.getTime().toString());
    Log.d("Current Time",today.getTime().toString());

    return time.getTime();

我看过关于这个问题的类似帖子。我检查并配置了我所有的时间规范,如时区、日期、年份,但仍然得到错误的结果。我不明白为什么会这样。也许我的代码做错了我不知道。我做错了什么? 大多数人建议使用 joda time,但我在切换 joda time 时太过分了。在切换到 joda time 之前有解决方案吗?

【问题讨论】:

Joda-Time 是 Java 8 及更高版本中内置的 java.time 类的前身。 【参考方案1】:

tl;博士

Duration
.between(
    Instant.now() ,
    myJavaUtilDate.toInstant()
)
.toMillis()

java.time

您正在使用 terrible 类,这些类在几年前被 JSR 310 中定义的现代 java.time 类所取代。切勿使用 CalendarDate、@ 987654324@.

Instant

如果您收到java.util.Date 对象,请立即转换为Instant 对象。使用添加到旧类的新转换方法。

Instant then = myJavaUtilDate.toInstant() ;

Instant 表示“在 UTC”中看到的时刻,偏移量为零时分秒。

以 UTC 格式捕捉当前时刻。

Instant now = Instant.now() ;

计算经过的时间。

Duration d = Duration.between( now , then ) ;

验证您的目标时刻确实在未来。

if( d.isNegative() )  … deal with faulty input … 

通常最好传递Duration 对象,而不是仅仅以毫秒或纳秒为单位的整数。但如果需要,您可以从 Duration 对象中提取计数。

long milliseconds = d.toMillis() ;

请注意,通过使用 UTC,我们无需处理任何时区问题。

安卓

如果使用 android 26+,此功能是内置的。对于早期的 Android,最新的工具通过“API 脱糖”实现了大部分功能。

【讨论】:

谢谢你,我真的不知道我使用了糟糕的类,我会根据你的建议更新我的对象。 @itsesc (a) 那些有缺陷的遗留类是由不了解日期时间处理的微妙和复杂性的人设计的。 (b) 您正在寻找的目标是毫秒数吗?如果没有,请编辑您的问题以澄清。然后我会更新我的答案。 是的,这就是我想要得到的。谢谢你的时间!!!

以上是关于Android Java:当前时间和未来特定时间之间的差异计算错误的主要内容,如果未能解决你的问题,请参考以下文章

当前和未来元素的事件监听器没有 jQuery

java之Date类及SimpleDateFormat类

Java:检查当前日期是不是在特定日期范围内[重复]

Date类型之继承方法

如何事先获取将存储在 Android/Java 缓存中的未来 Glide 图像大小?

Android GB28181接入端实时位置订阅和上报之-如何获取当前经纬度