Вопрос по datetime, jodatime, java, android, google-tasks-api – Использование библиотеки Joda-Time для преобразования строки в формат DateTime в API задач Google

4

У меня есть строка даты / времени, которую нужно отправить в 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 также была бы полезна.

По "Java DateTime" в вашем вопросе означает java.util.Date (в комплекте с Java) или com.google.api.client.util.DateTime, как видно из сообщения об ошибке? Вы должны быть внимательны, учитывая, что у нас есть несколько возможных рамок даты и времени. Basil Bourque
Уважаемый @BasilBourque, вы сделали правильное замечание. К сожалению, этому посту несколько лет, поэтому я не смогу его прояснить. Eugene van der Merwe
Спасибо, это была опечатка. Eugene van der Merwe
@EugenevanderMerwe Пожалуйста, уточните, о каких классах в каком API Google вы спрашиваете. Ссылка на официальный документ, чтобы устранить любую неопределенность. Basil Bourque
Случается ли это как «Joda-Time», не так ли? BoltClock♦

Ваш Ответ

1   ответ
3

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;

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, добавляя формальное имя часового пояса, что очень полезно.

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

Похожие вопросы