2016-03-02 3 views
0

Я столкнулся с этой странной проблемой при попытке разобрать даты строки, которые я прибил к этому:SimpleDateFormat с именами TimeZone на разных языках

устройство с некоторым для английского языка (эмулятор):

Date.toString() дает "Ср Фев 18 13:25:22 GMT 2016"

DateFormat newDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"); 
d1 = newDateFormat.parse("Thu Feb 18 13:25:22 GMT 2016"); //works fine 

устройства с немецкой локали:

Date.toString() дает «Чт Фев 18 13:25:22 МЭЗ 2016» (обратите внимание на часовой пояс на немецком языке, в то время как четверг еще четверг)

DateFormat newDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"); 
d1 = newDateFormat.parse("Thu Feb 18 13:25:22 MEZ 2016"); //does not parse 

DateFormat newDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.GERMAN); 
d1 = newDateFormat.parse("Thu Feb 18 13:25:22 MEZ 2016"); //does not parse 

DateFormat newDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US); 
String s = "Thu Feb 18 13:25:22 MEZ 2016"; 
s.replace("MEZ", "CET"); 
d1 = newDateFormat.parse(s); //works fine, but doesn't seem very portable 

Так что я искал способ, чтобы либо получить SimpleDateFormat игнорировать часовой пояс полностью (это было бы хорошо для моего приложения, единственное, что я пытаюсь сделать здесь, - это разделить время на «последний раз», которое будет дано в часах, если это меньше, чем на один день, но в дни или недели, если это больше, поэтому часовой пояс не имеет значения для этого случая использования),

или для получения SimpleDateFormat для понимания часовых поясов на языке устройства.

Бонусные баллы за хороший способ сохранить дату не зависящим от языка способом, сохраняя при этом информацию, такую ​​как часовой пояс и время суток в этом часовом поясе. (когда я обновляю свою базу данных в следующий раз)

+0

«Бонусные баллы за хороший способ сохранить дату не зависящим от языка способом, сохраняя при этом информацию, такую ​​как часовой пояс и время суток в этом часовом поясе» iso8601 формат datetime - ваш ответ – Bhargav

+0

В строке 'String s =" Thu Feb 18 13:25:22 MEZ 2016 ";' почему вы заменяете 'MEZ' на' CET', почему вы меняете часовой пояс того времени? Это неверно, поскольку эта отметка времени предназначена для часового пояса MEZ, и вы просто заменяете это на часовой пояс CET – Bhargav

+0

MEZ и CET - это одно и то же, всего на двух разных языках. – fifaltra

ответ

0

Я сделал это таким образом, чтобы получить текущую дату в формате YYYY-MM-DD.

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd", Locale.US); 
formatter.setTimeZone(TimeZone.getTimeZone("UTC")); 
String CurrentDate = formatter.format(new Date()); 
Date current_date = formatter.parse(CurrentDate); //In case need the entire Date value 

Надеюсь, это поможет!

+0

Не совсем, я конкретно спросил о сохранении информации о часовом поясе. И так или иначе, строки даты - это то, чем они являются сейчас, я не могу их изменить (по крайней мере, не так легко) – fifaltra

+0

Итак, вы хотите конвертировать строки даты из German Locale в США, не так ли? Поправьте меня, если я ошибаюсь. –

+0

@fifaltra - См. Мой отредактированный раздел один раз. Я добавил строку 'formatter.setTimeZone (TimeZone.getTimeZone (« UTC »));'. Дайте мне знать, если это вам подходит. –

0

Чтобы получить желаемый результат (который я считаю, выглядит примерно так: Mi. März 15:15:58 02-03-16 МЭЗ)

Я использовал следующий код:

public static final String DATE_FORMAT = "EEE MMM HH:mm:ss dd-MM-yy z"; 
private DateTimeFormatter mDateFormatter = DateTimeFormat.forPattern(DATE_FORMAT).withLocale(Locale.GERMAN); 

/** 
* Get formatted Date as Human Readable String 
* @param dateTime the time to print 
* @return Date as String 
*/ 
public String getFormattedDate(@NonNull DateTime dateTime) { 
    return mDateFormatter.print(dateTime); 
} 

Если вы хотите разницу во времени, вы можете взглянуть на JodaTime (http://www.joda.org/joda-time/). Я использовал его сам, он предоставляет простые интерфейсы для разницы во времени (Days, Hours, Minutes, Months, Seconds, Weeks, Years).

Сохраните даты в Unix Time (ISO 8601), всю необходимую информацию.

+0

Вычисление разницы во времени - это не моя проблема, разбор строки даты является проблемой. – fifaltra

+0

см. Обновленный ответ, надеюсь, это поможет –

0

Когда вы инстанцировании SimpleDateFormat,

DateFormat newDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");

SimpleDateFormat имеет конструктор, который принимает в локали, SimpleDateFormat(String) конструктор устаревшим теперь, вы должны использовать конструктор, который принимает в локали тоже, как это так,

DateFormat df = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.getDefault()); 

Теперь, если вы используете этот df.parse(myDateString) вам не нужно делать строку замены от MEZ до CET, потому что SimpleDateFormat знает, что ваш язык правильно проанализирует дату

+0

Я тоже так думал, но 'Locale.getDefault()' также не работал по какой-то причине – fifaltra

+0

@fifaltra 'Locale.getDefault()' возвращает стандартную локаль устройства, если ваш тестовое устройство имеет стандарт Locale of US, а затем, конечно, метки времени с языковой версией Германии не будут работать! Попробуйте изменить языковой стандарт вашего устройства, прежде чем тестировать временные метки разных языков – Bhargav

+0

, очевидно, я попробовал немецкий языковой стандарт на немецком устройстве, чтобы попытаться принудительно установить его в немецкий язык, поскольку getDefault также не работал. – fifaltra

Смежные вопросы