我正在构建一个 Android 应用程序,该应用程序使用户能够将事件插入 Google 日历和外部日历(如 Exchange 帐户)。
问题在于,如果用户想要在 2038 年之后添加事件,它会在过去创建事件(例如 - 2038 年 1 月变为 1901 年 12 月,2038 年 7 月 4 日变为 1902 年 5 月 28 日)。我做了一些研究,发现问题是“ 2038 年问题”。
2038 年问题是计算和数据存储情况的问题,其中时间值被存储或计算为有符号的 32 位整数,该数字被解释为自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数. 这样的实现不能对 2038 年 1 月 19 日 03:14:07 UTC 之后的时间进行编码。
可以用 Unix 有符号 32 位整数时间格式表示的最晚时间是 2038 年 1 月 19 日星期二 03:14:07 UTC(1970 年 1 月 1 日之后的 2,147,483,647 秒)。超出此时间的时间将“环绕”并在内部存储为负数,这些系统会将其解释为发生在 1901 年 12 月 13 日而不是 2038 年 1 月 19 日。这是由整数溢出引起的。
似乎我的 Java 代码工作正常,我得到的毫秒数还可以,但是当我将值发送到 Google APIinsert
函数时 - 我认为它不知道如何处理它,然后它在错误的日期插入事件( 1901 年及以上)。有什么办法可以处理吗?
这是我的代码:
private void InsertEvent(MyEvent myEvent) {
Uri EVENTS_URI = Uri.parse(getCalendarUriBase() + "events");
ContentValues eventValues = new ContentValues();
eventValues.put("eventTimezone", TimeZone.getDefault().getID());
eventValues.put("calendar_id", myEvent.calId);
eventValues.put("title",myEvent.title);
eventValues.put("allDay", 1);
long dateStart = myEvent.startDate.getTime(); // returns milliseconds - 2160248400000 for date 06/16/2038
eventValues.put("dtstart", dateStart );
long dateEnd = myEvent.endDate.getTime();
eventValues.put("dtend", dateEnd );
// At this point, in debug mode, I can see that the millisecond of dtstart and dtend are OK.
Uri u1 = contentResolver.insert(EVENTS_URI, eventValues ); // API's function
}
这是关于插入事件的 Google 文档:http: //developer.android.com/guide/topics/providers/calendar-provider.html#add-event