7

我正在构建一个 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

4

1 回答 1

1

如果没有您的所有代码,我无法完全提供帮助,但我之前遇到过类似的问题。我会检查您是否没有将任何内容投射到数据管道中的 int 中。

1.) 检查 MyEvent getTime() 不返回 int

2.) 检查 MyEvent SetTime 是否将其设置为 int

3.) 检查不存在其他 int 类型转换。

如果您要转换为 int、Implict 或 Explict,那么 java 会将您的数字转换为您的数字的负数表示。

于 2015-06-17T01:07:51.083 回答