首页 > 解决方案 > 仅需要日历实例日期(不是时间)并与 Kotlin 中的日期字符串进行比较,因为它滞后

问题描述

我只需要日历实例中的日期而不是时间。每当我使用日历对象时,它都会返回带有时间的日期。

val calendar = Calendar.getInstance()
calendar.time. // Mon Nov 09 11:41:29 GMT 2020

我通过使用 SimpleDateFormat 来改变它

SimpleDateFormat("dd/MM/yyyy").format(date)

09/09/2020

我正在创建日历,因此列表中有大量数据。我在特定日期添加数据。所以我将日期与字符串日期进行比较。我的字符串日期格式如下所示:-

20/05/2020

所以有太多的性能问题,比如滞后视图。那么有什么东西可以用来避免这一切。

val calendarModel = dataList?.find {
     SimpleDateFormat("dd/MM/yyyy").format(it.date) == item
}

标签: javaandroiddatekotlincalendar

解决方案


Calendar#getTime返回一个java.util.Date表示此日历时间值的对象,该时间值是一个毫秒值,它是从 Epoch 的偏移量,January 1, 1970 00:00:00.000 GMT.

因此,java.util.Date不代表真实的日期或时间或日期时间对象。当您打印此毫秒值时,您的 JVM 会计算其时区的日期和时间,当您打印其对象时,您会得到java.util.Date#toString返回的结果。从这个解释中,您一定已经明白这个毫秒值将与时区无关,因为它不是基于时区的值;相反,它被虚假地表示java.util.Date#toString为基于时区的值。为了演示我刚才所说的内容,请查看以下程序的输出:

import java.util.Date;
import java.util.TimeZone;

public class Main {
    public static void main(String[] args) {
        Date date = new Date();

        System.out.println("Asia/Calcutta:");
        TimeZone.setDefault(TimeZone.getTimeZone("Asia/Calcutta"));
        System.out.println(date.getTime());
        System.out.println(date);

        System.out.println("\nEurope/London:");
        TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
        System.out.println(date.getTime());
        System.out.println(date);

        System.out.println("\nAfrica/Johannesburg:");
        TimeZone.setDefault(TimeZone.getTimeZone("Africa/Johannesburg"));
        System.out.println(date.getTime());
        System.out.println(date);

        System.out.println("\nAmerica/New_York:");
        TimeZone.setDefault(TimeZone.getTimeZone("America/New_York"));
        System.out.println(date.getTime());
        System.out.println(date);
    }
}

输出:

Asia/Calcutta:
1604747702688
Sat Nov 07 16:45:02 IST 2020

Europe/London:
1604747702688
Sat Nov 07 11:15:02 GMT 2020

Africa/Johannesburg:
1604747702688
Sat Nov 07 13:15:02 SAST 2020

America/New_York:
1604747702688
Sat Nov 07 06:15:02 EST 2020

现代日期时间 API具有真正的日期时间类。下面给出了这些类的概述:

在此处输入图像描述

正如您可以在此表中找到的那样,有一个类LocalDate仅表示日期(由年、月和日组成)。下面给出了现代java.timeAPI 的快速演示:

import java.time.LocalDate;
import java.time.Month;
import java.time.ZoneId;
import java.time.ZoneOffset;

public class Main {
    public static void main(String[] args) {
        // A date with the given year, month and day-of-month
        LocalDate date = LocalDate.of(2010, Month.NOVEMBER, 7);
        System.out.println(date);

        // Today (in the JVM's timezone)
        LocalDate today = LocalDate.now(); // Same as LocalDate.now(ZoneId.systemDefault())
        System.out.println(today);

        // Today at UTC
        LocalDate todayAtUTC = LocalDate.now(ZoneOffset.UTC);
        System.out.println(todayAtUTC);

        // Today in India
        LocalDate todayInIndia = LocalDate.now(ZoneId.of("Asia/Calcutta"));
        System.out.println(todayAtUTC);
    }
}

输出:

2010-11-07
2020-11-07
2020-11-07
2020-11-07

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

建议:日期时间 APIjava.util及其格式化 APISimpleDateFormat已过时且容易出错。我建议您应该完全停止使用它们并切换到现代日期时间 API

如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请通过 desugaring和How to use ThreeTenABP in Android Project检查Java 8+ APIs available


推荐阅读