Плохой startMin / startMax при получении записей календаря Google, Java-клиент Google API

Я делаю один и тот же запрос, чтобы получать события календаря двумя разными способами. Странно то, что одним способом это работает, а другим - нет, хотя все почти одинаково. Используя timeMin, timeMax в Google API Explorer возвращает неверный запрос для времени, которое отправляет второй метод.

Не только это, но и в документации API Календаря Google указано, что поле должно быть start-min и start-max, в то время как клиент и API Explorer говорят, что поле должно быть timeMin и timeMax.

Вот код для метода 1, который работает:

void setPeriod() {
    Date nowDate = new Date();
    startTime = new DateTime(nowDate);
    Time t = new Time();
    t.setToNow();
    t.hour = 23;
    t.minute = 59;
    nowDate.setTime(t.toMillis(false));
    endTime = new DateTime(nowDate);
}

new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
    try {
    Events evlist = g.getClient().events().list(calendarIds.get(cal)).setTimeMin(startTime).setTimeMax(endTime).execute();
    if (evlist.getItems() != null) {
        //Parse the events
    ...
}.execute();

Способ 2:

new AsyncTask<Void, Void, List<Event>>() {
    @Override
protected List<Event> doInBackground(Void... arg0) {
    Date nowDate = new Date();
    DateTime startTime = new DateTime(nowDate);
    Time t = new Time();
    t.setToNow();
    t.hour = 23;
    t.minute = 59;
    nowDate.setTime(t.toMillis(true));
    DateTime endTime = new DateTime(nowDate);
    Calendar client = com.google.api.services.calendar.Calendar
                .builder(transport, jsonFactory)
                .setApplicationName("Wayk by Senti")
                .setHttpRequestInitializer(
                    new HttpRequestInitializer() {
                        public void initialize(HttpRequest request)
                                        throws IOException {
                                    request.getHeaders()
                                            .setAuthorization(
                                                    GoogleHeaders
                                                            .getGoogleLoginValue(authToken));
                                }
                            })
                    .setJsonHttpRequestInitializer(
                            new JsonHttpRequestInitializer() {

                                public void initialize(
                                        JsonHttpRequest request)
                                        throws IOException {
                                    CalendarRequest calendarRequest = (CalendarRequest) request;
                                    calendarRequest
                                            .setKey(CalendarClientCredentials.KEY);
                                }
                            }).build();
            try {
                List<Event> events = new ArrayList<Event>();
                for (int i = currentCal; i < enables.size(); i++) {
                    if (enables.get(i)) {
                        AiLog.v("Getting events");
                        AiLog.v("AuthToken: " + authToken);
                        AiLog.v("CalendarID: " + calendarIds.get(i));
                        AiLog.v("Calendar name: " + calendarNames.get(i));
                        AiLog.v("Calendar account: " + account);
                        Calendar.Events.List eventReq = client.events()
                                .list(calendarIds.get(i)).setTimeMin(startTime).setTimeMax(endTime).execute();//Bad request here

Обратите внимание, что клиент одинаков для обоих. Клиент во втором методе успешно получает список календарей для учетной записи. Я проверил, что идентификатор календаря правильный, что оставляет меня с ошибкой, исходящей от startMin и startMax.

Любая помощь приветствуется.

Ура, Z


person Zaid Daghestani    schedule 17.07.2012    source источник
comment
Это проблема с полями timeMin и timeMax. Если вы удалите минимальное и максимальное время, все будет нормально. Я пытался решить ту же проблему с последними библиотеками. Дело в более ранних версиях (библиотека api календаря v1.5.0), timeMin и timeMax принимали строковые значения, поэтому я мог форматировать дату в соответствии с часовым поясом, но теперь он был изменен, чтобы принимать значение DateTime и устанавливать значение DateTime даже с использованием конструктор, который принимает сдвиг часового пояса, похоже, не работает и выдает 400 Bad Request.   -  person praneetloke    schedule 19.07.2012
comment
У меня это тоже работало в более старой библиотеке. Но я, наконец, разобрался. Проверить ответ   -  person Zaid Daghestani    schedule 20.07.2012


Ответы (1)


Догадаться.

Вы должны использовать конструктор DateTime, который принимает TimeZone.

ie

DateTime startTime = new DateTime(new Date(), TimeZone.getDefault());

Надеюсь, это сэкономит кому-то еще 16 часов, которые я потратил, пытаясь понять это. Действительно плохая документация.

person Zaid Daghestani    schedule 19.07.2012
comment
Спасибо. Я использовал конструктор DateTime, который принимает tz shift int, и он не работал, но сработала передача объекта Date и экземпляра объекта TimeZone по умолчанию! - person praneetloke; 20.07.2012
comment
Действительно ужасная документация, я был разочарован, пытаясь понять это. Спасибо! - person Dymas; 07.01.2020