【问题标题】:how to check if update date is greater then current date in android studio java如何检查更新日期是否大于android studio java中的当前日期
【发布时间】:2021-06-22 09:15:08
【问题描述】:

我想根据与当前时间的更新日期/时间相比的状态更改特定表格行的背景可绘制对象,并检查自上次更新日期/时间以来是否已经 24 小时,并设置不同的背景可绘制对象。

到目前为止我得到的东西有效,但我不知道如何检查它是否是 24 小时,而不仅仅是大于当前时间

   JobRepository jobRepository = new JobRepository(a.getApplication());
        jobRepository.findEnquiry().observe(getViewLifecycleOwner(), jobsEnquiry -> {
        TableRow[] tableRows = new TableRow[jobsEnquiry.size()];

        for (int i=0; i<jobsEnquiry.size(); i++) {
            Job job = jobsEnquiry.get(i).job;
            tableRows[i] = new TableRow(a);
            tableRows[i].setId(i + 1);
            tableRows[i].setPadding(0,20,0,20);
            if(job.getStatus().equals("Left message/Awaiting reply")){
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd H:m:s");
                Date updatedDate = job.getUpdatedAt();
                Date date = job.getDate();
                Date currentTime = Calendar.getInstance().getTime();
                tableRows[i].setBackgroundResource(android.R.drawable.list_selector_background);
                tableRows[i].setBackgroundResource(R.drawable.table_outline);

                if (updatedDate.getTime() < currentTime.getTime()){
                    tableRows[i].setBackgroundResource(android.R.drawable.list_selector_background);
                    tableRows[i].setBackgroundResource(R.drawable.table_outline_status);
                }

            }
            else if(job.getStatus().equals("Action required")){
                tableRows[i].setBackgroundResource(android.R.drawable.list_selector_background);
                tableRows[i].setBackgroundResource(R.drawable.table_outline_status);
            }

【问题讨论】:

  • 你不能使用java.time 来完成这样的任务吗?为什么要使用过时的java.util.Date
  • 这是目前有效的方法,job.getUpdatedAt() 需要日期加上我不熟悉 java.time
  • 好吧,我明白了... 重构大量代码并不是一件好事,但java.time 是一项真正的改进。值得一看...
  • 另外,从性能的角度来看,这非常糟糕。在每次迭代中创建一个 SimpleDateFormat 是……昂贵的。许多混合职责,更不用说您基本上忽略了时区和偏移量,因此时间的更改(如夏令时)可能会在此代码中产生不正确的结果。

标签: java android android-studio date drawable


【解决方案1】:

Date 类上 getTime() 的返回值是 long 参见:https://developer.android.com/reference/java/util/Date#getTime()

所以下面的代码可以工作,但它不能很好地处理时区。

private final long TWENTYFOUR_HOURS = TimeUnit.HOURS.toMillis(24);

if ((updatedDate.getTime() + TWENTYFOUR_HOURS) < currentTime.getTime()){
//Do something
}

if ((updatedDate.getTime() + TimeUnit.HOURS.toMillis(24)) < currentTime.getTime()){
//Do something
}

【讨论】:

  • 我认为只要它在updatedDate.getTime() 的 24 小时后工作就可以了,到目前为止似乎运行良好。谢谢
  • 嗯,是的,如果我为 updatedDate 设置不同的日期,它实际上不会起作用
  • 不用担心,如果是已接受的答案,请标记为是。谢谢。
【解决方案2】:

java.time 脱糖

考虑为您的日期和时间工作使用现代 Java 日期和时间 API java.time。此外,当您从旧版 API 获得老式的 Date 对象时。首先将每个Date 转换为现代Instant

    Instant twentyfourHoursAgo = Instant.now().minus(24, ChronoUnit.HOURS);
    List<Date> dates = Arrays.asList(new Date(1_624_298_359_544L), new Date(1_624_240_459_544L),
            new Date(1_624_377_259_544L), new Date(1_624_297_759_544L));
    for (Date updatedDate : dates) {
        Instant updatedInstant = DateTimeUtils.toInstant(updatedDate);
        if (updatedInstant.isAfter(twentyfourHoursAgo)) {
            System.out.println("" + updatedDate + ": updated within 24 hours");
        } else {
            System.out.println("" + updatedDate + ": it has been 24 hours since last update");
        }
    }

一分钟前我在欧洲/哥本哈根时区运行代码时的输出:

Mon Jun 21 19:59:19 CEST 2021: updated within 24 hours
Mon Jun 21 03:54:19 CEST 2021: it has been 24 hours since last update
Tue Jun 22 17:54:19 CEST 2021: updated within 24 hours
Mon Jun 21 19:49:19 CEST 2021: it has been 24 hours since last update

我已经为 ThreeTen Backport 编码(见下文)。它提供DateTimeUtils 用于在老式类型和现代类型之间进行转换。如果使用脱糖或本机 java.time 从DateInstant 的转换稍微简单一点,只需updatedDate.toInstant()toInstant 方法已添加到Date 在 Java 8 中)。

问题:java.time 不需要 Android API 26 级吗?

java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少 Java 6

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。
  • 在非 Android Java 6 和 7 中,获取 ThreeTen Backport,这是现代类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
  • 在较旧的 Android 上,请使用脱糖或 Android 版本的 ThreeTen Backport。它被称为 ThreeTenABP。在后一种情况下,请确保从 org.threeten.bp 导入日期和时间类以及子包。

链接

【讨论】:

  • 这个信息量很大,我会试一试。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-07-29
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多