Поведение 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));

0 ответов

Другие вопросы по тегам