1

我要根据年月日时分计算次数。(秒统一为零,我不需要秒)

我选择 HashMap 作为数据结构。

HashMap<Calendar,Integer> arr_time; 

如果已经有相同的时间(年,月,日,小时,分钟),我想增加整数,或者添加一个新的时间(年,月,日,小时,分钟)。

Calendar calendar = Calendar.getInstance();
calendar.set(mYear,mMonth,mDay,mHour,mMinute,0);
if(arr_time.containsKey(calendar)){
  // increase Integer value
  // ++1;
}else{
  // add new time 
  // arr_time.put(calendar,1);
}

我认为如果年、月、日、小时和分钟相同,它会识别相同的日历。但事实并非如此。

问题是什么?

我没有使用“日期”。因为,Android Devloper 是这么说的。

Date(int year, int month, int date, int hrs, int min, int sec) 此构造函数在 API 级别 1 中已弃用。从 JDK 版本 1.1 开始,由 Calendar.set(year + 1900, month, date, hrs , min, sec) 或 GregorianCalendar(year + 1900, month, date, hrs, min, sec)。

4

2 回答 2

1
于 2019-02-20T07:47:20.900 回答
0

java.time

    Map<LocalDateTime, Integer> arr_time = new HashMap<>();
    ZoneId zone = ZoneId.of("Antarctica/Vostok");

    for (int i = 0; i < 10; i++) {
        LocalDateTime now = LocalDateTime.now(zone).truncatedTo(ChronoUnit.MINUTES);
        arr_time.compute(now, (ldt, oldCount) -> oldCount == null ? Integer.valueOf(1) : oldCount + 1);

        TimeUnit.MILLISECONDS.sleep(103);
    }
    System.out.println(arr_time);

刚才运行代码时,我得到:

{2019-02-20T13:42=10}

我录制了 10 次,中间睡着以确保它们不完全相同。但是因为我将每一个都截断为整分钟,所以它们最终2019-02-20T13:42都被一起计算了。

LocalDateTime要从int变量创建:

    int mYear = 2019;
    int mMonth = Calendar.JANUARY;
    int mDay = 31;
    int mHour = 23;
    int mMinute = 45;
    LocalDateTime ldt = LocalDateTime.of(mYear, mMonth + 1, mDay, mHour, mMinute);
    System.out.println(ldt);

2019-01-31T23:45

由于您使用mMonthwith Calendar,我认为它是基于 0 的。LocalDateTime从 1 开始的数字个月,就像人类一样,所以我需要加 1。

你的代码出了什么问题?

calendar.set(mYear,mMonth,mDay,mHour,mMinute,0)设置年、月、日、小时、分钟和秒,但不设置毫秒。由于每个Calendar对象都是使用当前时间创建的,因此毫秒通常会不同,因此即使您设置相同的值,Calendar对象仍然不相等。

6-arg 方法的这种行为set让很多人感到惊讶,并且只是类设计不佳的众多点中的一个小点。你不应该使用它。自 2014 年以来,我们就有了 java.time,所以真的没有理由这样做。

问题:我可以在 Android 上使用 java.time 吗?

是的,java.time 在较旧和较新的 Android 设备上运行良好。它只需要至少Java 6

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

链接

于 2019-02-20T07:47:36.393 回答