Поведение DateFormat в Java отличается от поведения DateFormat в Android
Мое требование состоит в том, чтобы отформатировать время, основанное на определенном locale
,
Я написал программу на Java для форматирования текущего времени на основе некоторых локалей, и он выдает результат, как показано ниже:
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
public class DateFormatDemo {
static public void showTimeStyles(Locale currentLocale) {
Date today = new Date();
String result;
DateFormat formatter;
int[] styles = { DateFormat.DEFAULT, DateFormat.SHORT, DateFormat.MEDIUM,
DateFormat.LONG, DateFormat.FULL };
System.out.println();
System.out.println("Locale: " + currentLocale.toString());
System.out.println();
for (int k = 0; k < styles.length; k++) {
formatter = DateFormat.getTimeInstance(styles[k], currentLocale);
result = formatter.format(today);
System.out.println(result);
}
}
static public void main(String[] args) {
showTimeStyles(new Locale("en", "US"));
showTimeStyles(new Locale("fr", "FR"));
showTimeStyles(new Locale("de", "DE"));
}
}
Результат вышеупомянутой Java-программы:
Locale: en_US
9:49:37 AM
9:49 AM
9:49:37 AM
9:49:37 AM UTC
9:49:37 AM UTC
Locale: fr_FR
09:49:37
09:49
09:49:37
09:49:37 UTC
09 h 49 UTC
Locale: de_DE
09:49:37
09:49
09:49:37
09:49:37 UTC
09:49 Uhr UTC
Таким образом, в основном для en-US формат времени будет в 12-hour format
и для FR-FR, формат времени будет в 24-hours format
,
Тем не менее, когда я использую тот же код в приложении Android, как показано ниже:
public void showTimeStyles(Locale currentLocale) {
Date today = new Date();
String result;
DateFormat formatter;
int[] styles = { DateFormat.DEFAULT, DateFormat.SHORT, DateFormat.MEDIUM,
DateFormat.LONG, DateFormat.FULL };
Log.d("MY_APP","Locale: " + currentLocale.toString());
for (int k = 0; k < styles.length; k++) {
formatter = DateFormat.getTimeInstance(styles[k], currentLocale);
result = formatter.format(today);
Log.d("MY_APP",result);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
final View rootView = inflater.inflate(R.layout.fragment_home, container, false);
showTimeStyles(new Locale("en", "US"));
showTimeStyles(new Locale("fr", "FR"));
showTimeStyles(new Locale("de", "DE"));
return rootView;
}
Выход вышеупомянутой программы для Android показан ниже:
D/MY_APP: Locale: en_US
D/MY_APP: 3:28:19 PM
D/MY_APP: 3:28 PM
D/MY_APP: 3:28:19 PM
D/MY_APP: 3:28:19 PM GMT+05:30
D/MY_APP: 3:28:19 PM India Standard Time
D/MY_APP: Locale: fr_FR
D/MY_APP: 3:28:19 PM
D/MY_APP: 3:28 PM
D/MY_APP: 3:28:19 PM
D/MY_APP: 15:28:19 GMT+05:30
D/MY_APP: 15:28:19 heure de l’Inde
D/MY_APP: Locale: de_DE
D/MY_APP: 3:28:19 nachm.
D/MY_APP: 3:28 nachm.
D/MY_APP: 3:28:19 nachm.
D/MY_APP: 15:28:19 GMT+05:30
D/MY_APP: 15:28:19 Indische Zeit
Теперь, если мы сравним вывод как кода Java, так и кода Android, для локали "fr-FR" время отображается в 12-часовом формате в Android и 24-часовом формате в Java.
Правильный вывод - это вывод, который мы получаем из кода Java. То есть на французском стандартным форматом времени является 24-часовой формат, а не 12-часовой формат с AM/PM.
Почему поведение кода отличается?
Как мы получаем локализованный формат времени в Android для конкретной локали?
Можно ли получить локализованный формат времени в Joda-Time
для Android, если так, как?
С помощью Joda-time
Я попробовал приведенный ниже код, но вывод был все еще в 12-часовом формате для "FR-FR":
//Convert the received timestamp to Joda DateTime
DateTime dt = new DateTime(date);
// translate the received DateTime to the time in the User's Time Zone
DateTime dateInUserTimeZone = dt.withZone(DateTimeZone.forID(User.getInstance().getTimeZone()));
String pattern = DateTimeFormat.patternForStyle("MM", new Locale("fr","FR"));
DateTimeFormatter formatterOutput1 = DateTimeFormat.forPattern(pattern);
Log.d("MY_APP","DateTime:"+formatterOutput1.print(dateInUserTimeZone));