0

我正在尝试添加事件,但它显示了我尝试输入的不同日期以及我得到的内容。

eventButton.setOnClickListener(
        new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                Calendar calendarEvent = Calendar.getInstance();
                Intent calendarIntent = new Intent(Intent.ACTION_EDIT);
                calendarIntent.setType("vnd.android.cursor.item/event");

                Calendar time = Calendar.getInstance();
                time.clear();
                time.set(2018, 05, 23);

                calendarIntent.putExtra(CalendarContract.Events.TITLE, "Whatever");
                calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME,time.getTimeInMillis());
                calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME,time.getTimeInMillis());
                calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY,true);
                calendarIntent.putExtra(CalendarContract.Events.RRULE, "FREQ=YEARLY");
                startActivity(calendarIntent);

            }
        }
);

我收到的是 6 月 22 日,而不是 5 月 23 日: 截图

4

2 回答 2

1
    long eventTimeInMillis = LocalDate.of(2018, Month.MAY, 23)
            .atStartOfDay(ZoneOffset.UTC)
            .toInstant()
            .toEpochMilli();

正如 Jamie Corkhill 在评论中所说,您需要 UTC 开始时间 (00:00) 的时间。上面的代码不仅给你 UTC 00:00 的时间,而且很清楚这就是它给你的。

我正在使用java.time现代 Java 日期和时间 API。我发现它比长期过时的Calendar课程更好用。

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

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

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

链接

于 2018-04-16T10:31:11.923 回答
0

JavaCalendar.set()方法像编程中的数组一样计算月份,从 0 开始表示一月份。因此,您的月份应该是4五月,因为一月是 0,二月是 1,三月是 2,依此类推。这就是我认为导致您的问题的原因。

您也可以使用 Month 枚举。也就是说,而不是使用你的线

time.set(2018, 05, 23);

利用

time.set(2018, Calendar.May, 23);

我希望这有帮助。

于 2018-04-15T18:46:21.830 回答