Использование библиотеки Joda-Time для преобразования строки в формат DateTime в API задач Google

У меня есть строка даты / времени, которую нужно отправить в API задач Google, но я не могу понять, как преобразоватьJoda времени библиотекаDateTime Объект объекта Java DateTime. Я использую Android в качестве платформы.

Строка начинается с «2012/07/19 22: 00: 00». и сначала преобразуется в формат Iso.

Вот мой код:

    Task task = new Task();
    task.setTitle(title);
    task.setNotes(note);        
    DateTimeFormatter formatter =  DateTimeFormat.forPattern("yyyy/MM/dd HH:mm:ss");
    DateTime dt = formatter.parseDateTime(dateToIso("2012/07/19 22:00:00"));
    task.setDue(dt);    

private String dateToIso(String date) {
    date = date.replace("/", "-");
    date = replaceCharAt(date, 10, 'T');
    date = date + ".000Z";
    return date;
}

Я получаю ошибку:

"Type mismatch: cannot convert from org.joda.time.DateTime to com.google.api.client.util.DateTime"

Пожалуйста помогите. Информация относительно преобразования ISO также была бы полезна.

 Eugene van der Merwe19 июл. 2012 г., 21:58
Спасибо, это была опечатка.
 Basil Bourque12 февр. 2014 г., 10:33
По "Java DateTime" в вашем вопросе означает java.util.Date (в комплекте с Java) или com.google.api.client.util.DateTime, как видно из сообщения об ошибке? Вы должны быть внимательны, учитывая, что у нас есть несколько возможных рамок даты и времени.
 BoltClock♦19 июл. 2012 г., 21:53
Случается ли это как «Joda-Time», не так ли?
 Basil Bourque31 мар. 2015 г., 23:55
@EugenevanderMerwe Пожалуйста, уточните, о каких классах в каком API Google вы спрашиваете. Ссылка на официальный документ, чтобы устранить любую неопределенность.
 Eugene van der Merwe01 апр. 2015 г., 06:44
Уважаемый @BasilBourque, вы сделали правильное замечание. К сожалению, этому посту несколько лет, поэтому я не смогу его прояснить.

Ответы на вопрос(1)

Let Formatter Parse String

Проблема в вашем & quot; dateToIso & quot; метод. Нет необходимости в этом.DateTimeFormatter Работа объекта состоит в том, чтобы анализировать строку, когда задан правильный формат. Вы действительно дали правильный формат. А потом вы пошли и превратили строку в другой формат!

Решение: (а) Убей свой метод dateToIso. (б) Удалить вызов этого метода. Просто передайте оригинальную строкуparseDateTime.

Побочная проблема: вы проигнорировали вопрос о часовом поясе. Поэтому при анализе этой строки Joda-Time будет предполагать, что событие этой даты-времени произошло в часовом поясе JVM по умолчанию. Таким образом, выполнение этого же кода с теми же входами, но на другом компьютере / JVM с другими настройками часового поясаresult in different output, Наверное, не то, что вы хотите. Извлеченный урок: всегда указывайте часовой пояс, а не полагайтесь на значение по умолчанию.

Еще одна проблема: ошибка, которую вы процитировали, - это другая проблема, конвертируемая из Joda-Time в Google. Читать дальше.

Read The Doc

Если вы пытаетесь конвертировать вашиorg.joda.time.DateTime возражать противcom.google.api.client.util.DateTime объект, просто посмотрите наJavaDoc, Там вы увидите, что конструктор Google DateTime принимает java.util.Date. Joda-Time имеет встроенныйtoDate метод для преобразования в объект java.util.Date для взаимодействия с другими классами.

Food-Chain

Создайте пищевую цепочку таких объектов:

org.joda.time.DateTime → java.util.Date → com.google.api.client.util.DateTime

Некоторый непроверенный код & # x2026;

org.joda.time.DateTimeZone = org.joda.time.DateTimeZone.forID( "Africa/Johannesburg" );
org.joda.time.DateTime jodaDateTime = new DateTime( timeZone );

// Convert from Joda-Time to old bundled j.u.Date
java.util.Date juDate = jodaDateTime.toDate();

// Convert from j.u.Date to Google Date.
com.google.api.client.util.DateTime googleDateTime = new com.google.api.client.util.DateTime( juDate );
Milliseconds

Кроме того, вы можете извлечь и передать миллисекунды.

Как правило, я рекомендую избегать прямого обращения с миллисекундами, где это возможно. Использование миллисекунд может быть запутанным, небрежным и подверженным ошибкам. Подсчет миллисекунд трудно отладить, поскольку люди не могут легко расшифровать значение даты и времениlong, В то время как Joda-Time и java.util.Date используют миллисекунды с начала Unix-эпохи в качестве внутреннего механизма отслеживания времени & # x2026;

Some software uses seconds or nanoseconds rather than milliseconds. Some software uses other epochs rather than the Unix epoch. Going The Other Direction

[В следующем разделе предполагается, что Google заменил API, на который ссылается Вопрос, более новым API. Не уверен, что это предположение верно.]

При переходе отcom.google.gdata.data.DateTime объект Joda-Time DateTime, я бы использовал подсчет миллисекунд от эпохи, предоставленнойgetValue метод. Обратите внимание, что он возвращает 64-битныйlongвместо 32-битногоint.

Обязательно назначьте нужный часовой пояс Joda-TimeDateTime вместо того, чтобы полагаться на неявное присвоение JVMтекущий часовой пояс по умолчанию.

long millisecondsFromUnixEpoch = myGoogleDateTime.getValue();
org.joda.time.DateTimeZone zone = DateTimeZone.forID( "Africa/Johannesburg" );
org.joda.time.DateTime jodaDateTime = new DateTime( millisecondsFromUnixEpoch, zone );

Google API предоставляет несколько других вариантов.

toStringRfc822

Вы могли бы позвонитьtoStringRfc822 метод для генерации строки для анализа Joda-Time. К сожалению, RFC 822 неловко и неоднозначно разобрать. Среди других неисправностей он использует нестандартные неуникальные 3-4-буквенные коды часовых поясов, а неправильные названия часовых поясов, Joda-Time отказывается пытаться проанализировать эти коды из-за их неоднозначности. Я предполагаю, что Google только включает это здесь для обратной совместимости со старыми API / библиотеками. Современные интернет-протоколы перешли на ISO 8601.

toUiString

Возможно, вы могли бы позвонитьtoUiString метод для создания строки для анализа Joda-Time. К сожалению, их документация не объясняет, какой формат используется этим методом.

toString

Вы могли бы позвонитьtoString метод, который задокументирован как производящийxs:dateTime строка. Документ не может объяснить точно, но я предполагаю, что они имеют в видуВключение спецификации XML-схемы в ISO 8601, Вы можете попробовать этот метод, чтобы увидеть, что он генерирует. Это может быть полезно, если вы хотите сохранить смещение от UTC, встроенное в объект Google. Но помните, что часовой пояс больше, чем смещение от UTC, поэтому вы все равно должны назначить желаемый / ожидаемый часовой пояс вашему объекту Joda-Time DateTime. Поэтому я не уверен, что это лучше, чем просто передатьlong отсчет времени до конструктора Joda-Time DateTime.

java.time

Теперь, когдаJava 8 выпущен, возможно, Google может модернизировать свои API, чтобы использоватьпакет java.time.

Обратите внимание, что java.time расширяет формат ISO 8601, добавляя формальное имя часового пояса, что очень полезно.

 01 апр. 2015 г., 16:38
Еще раз спасибо. Добавление ссылки выше. Отthis мне кажется, что клиент gdata устарел, по крайней мере, для API календаря
 01 апр. 2015 г., 01:04
Вау, спасибо за подробный ответ! Особенно для объяснения проблемы с попыткой использовать метод RFC822. Я попробуюlong + часовой пояс. Я не уверен, устарел ли он, но я действительно использую com.google.api.client.util.DateTime, хотя и с Calendar API.
 31 мар. 2015 г., 23:38
@xdhmoore Я добавил еще один раздел в свой ответ "Идем в другом направлении", чтобы ответить на вопрос вашего комментария.UPSHOT: Я хотел бы использовать объект GooglegetValue способ вернутьlongи передать этоlong в Йода-ТаймDateTime конструктор вместе с желаемым часовым поясом.
 01 апр. 2015 г., 01:25
@xdhmoore Когда я Google дляcom.google.api.client.util.DateTime Меня привели кcom.google.gdata.data.DateTime, В комментарии к Вопросу я предлагаю вам предоставить ссылки на документацию класса в вашем Вопросе.
 31 мар. 2015 г., 17:46
Спасибо за Ваш ответ. Есть ли лучший способ, чем миллисекунды, идти в другом направлении, от Google Date до Joda Date?

Ваш ответ на вопрос