Как отформатировать дату и время в Android?

Как правильно отформатировать в соответствии с датой и временем конфигурации устройства при наличии года, месяца, дня, часа и минуты?

337
0
612 838
26
Перейти к ответу Данный вопрос помечен как решенный

Ответы 26

Ответ принят как подходящий

Используйте стандартный класс Java DateFormat.

Например, чтобы отобразить текущую дату и время, выполните следующие действия:

Date date = new Date(location.getTime());
DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
mTimeText.setText("Time: " + dateFormat.format(date));

Вы можете инициализировать объект Date своими собственными значениями, однако вы должны знать, что конструкторы устарели, и вы действительно должны использовать объект Java Calendar.

Это android.text.format.DateFormat, а не java.text.DateFormat.

jamesh 08.09.2009 03:31

Для Android IME довольно типично иметь два класса, оба из которых утверждают, что дают результат, установленный на локаль по умолчанию, но один нет. Так что да, не забудьте использовать версию DateFormat android.text.format (которая даже не является производным от java.util one LOL).

mxcl 20.07.2010 18:14

у меня проблема с тем, что я должен импортировать - я имею в виду файлы lib :(

Harsha M V 27.12.2010 15:30

@Harsha - чтобы обойти эту проблему, я связываю свое использование DateFormat, поэтому мне нужно только ссылаться на класс Android, и поэтому нет никаких неоднозначных классов. final String dateStr = DateFormat.getDateFormat (this) .format (d); Вы можете использовать метод Android format () и иметь (IMHO) более чистый код и на один объект меньше для создания экземпляра.

Jerry Brady 22.08.2011 23:06

Это средство форматирования включает только дату, а не время, как указано в исходном вопросе. Вместо этого используйте DateUtils из того же пакета, см. stackoverflow.com/questions/2983920/…

Asmo Soinio 02.12.2011 17:43

Обратите внимание на эту строку: DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationC‌​ontext()); Возвращаемый dateFormat имеет тип java.text.DateFormat (а НЕ android.text.format.DateFormat)

Arye Rosenstein 13.02.2011 09:53

К сожалению, это может работать не на всех устройствах. Я тестирую с HTC desire с «Выберите формат даты» в настройках как ddd, MMM dd, yyyy, а dateformatter возвращает MM / dd / yy!

RobCroll 26.12.2012 22:25

Для полного формата используйте api. android.text.format.DateFormat.getLongDateFormat (Контекст);

allsoft 30.05.2018 17:47

@JerryBrady, по-вашему, чище, возможно, вы захотите написать его как отдельный ответ.

ThomasW 21.11.2018 11:10

Это сделает это:

Date date = new Date();
java.text.DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
mTimeText.setText("Time: " + dateFormat.format(date));

Будет ли это локализовано, когда пользователь меняет язык на устройстве Android?

Kannan_SJD 01.07.2016 10:16

На мой взгляд, android.text.format.DateFormat.getDateFormat(context) сбивает меня с толку, потому что этот метод возвращает java.text.DateFormat, а не android.text.format.DateFormat - - ".

Итак, я использую код фрагмента, как показано ниже, чтобы получить текущую дату / время в моем формате.

android.text.format.DateFormat df = new android.text.format.DateFormat();
df.format("yyyy-MM-dd hh:mm:ss a", new java.util.Date());

or

android.text.format.DateFormat.format("yyyy-MM-dd hh:mm:ss a", new java.util.Date());

Кроме того, вы можете использовать другие форматы. Следуйте Формат даты.

Полезно, но вопрос сказал "по конфигурации устройства". Для меня это означает использование формата, выбранного на основе языка / страны пользователя или выбранного пользователем напрямую, а не жесткого кодирования выбора формата.

Chris Boyle 14.10.2010 20:26

Кроме того, не забывайте, что hh:mm:ss даст вам 01:00:00 в час дня, вам нужно будет использовать kk:mm:ss, чтобы получить 13:00:00

dnet 17.04.2012 15:51

@dnet k - это час в день (1-24), вы не имеете в виду H, который является часом в день (0-23), например. ЧЧ: мм: сс? См .: developer.android.com/reference/java/text/SimpleDateFormat.h‌ tml

Joony 07.12.2012 17:25

@Joony, нет, есть разница между java.text.SimpleDateFormat (то, что вы связали и использует H в течение часов в диапазоне 0-23) и android.text.format.DateFormat (о чем идет ответ, и использует k в течение нескольких часов в диапазоне 0-23)

dnet 08.12.2012 02:51

@dnet После тестирования вы правы насчет k, однако в документации по DateFormat четко указано, что Каноническую документацию по форматным строкам см. В SimpleDateFormat. Очень сбивает с толку. Или я что-то упускаю?

Joony 10.12.2012 15:24

Похоже, что формат - это статический метод в android.text.format.DateFormat.

Muthukannan Kanniappan 05.12.2013 18:15

@Joony, я вижу ваше замешательство, и у меня был огромный момент WTF, см. этот коммит для android...DateFormat, но похоже, что SimpleDateFormat работает так, как задумано.

TWiStErRob 20.12.2014 03:50

Вы также можете использовать android.text.format.DateFormat.getLongDateFormat ().

Borzh 17.06.2015 18:14

Этот код вернет текущую дату и время:

public String getCurrDate()
{
    String dt;
    Date cal = Calendar.getInstance().getTime();
    dt = cal.toLocaleString();
    return dt;
}

toLocaleString () устарела

nspo 28.03.2013 21:13

Пытаться:

event.putExtra("startTime", "10/05/2012");

И когда вы обращаетесь к переданным переменным:

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
Date date = formatter.parse(bundle.getString("startTime"));

Используйте эти две как переменные класса:

 public java.text.DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
 private Calendar mDate = null;

И используйте это так:

 mDate = Calendar.getInstance();
 mDate.set(year,months,day);                   
 dateFormat.format(mDate.getTime());

Используйте SimpleDateFormat

Как это:

event.putExtra("starttime", "12/18/2012");

SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
Date date = format.parse(bundle.getString("starttime"));

Да, с языковой стандарт по умолчанию, чтобы избежать проблем с производительностью: new SimpleDateFormat("my-format", Locale.getDefault());

iutinvg 10.04.2013 09:33

Используйте сборку в классе Time!

Time time = new Time();
time.set(0, 0, 17, 4, 5, 1999);
Log.i("DateTime", time.format("%d.%m.%Y %H:%M:%S"));

Это оптимальное решение, поскольку в нем используется облегченный объект Time из Android Framework: developer.android.com/reference/android/text/format/Time.htm‌ l

Dean Wild 29.01.2013 16:17

Это нет - оптимальное решение: он не соблюдает формат даты из локали пользователя.

Dan Hulme 25.04.2013 20:47

Класс Android Time предоставляет 3 метода форматирования http://developer.android.com/reference/android/text/format/Time.html

Вот как я это сделал:

/**
* This method will format the data from the android Time class (eg. myTime.setToNow())   into the format
* Date: dd.mm.yy Time: hh.mm.ss
*/
private String formatTime(String time)
{
    String fullTime= "";
    String[] sa = new String[2];

    if (time.length()>1)
    {
        Time t = new Time(Time.getCurrentTimezone());
        t.parse(time);
        // or t.setToNow();
        String formattedTime = t.format("%d.%m.%Y %H.%M.%S");
        int x = 0;

        for(String s : formattedTime.split("\\s",2))
        {   
            System.out.println("Value = " + s);
            sa[x] = s;
            x++;
        }
        fullTime = "Date: " + sa[0] + " Time: " + sa[1];
    }
    else{
        fullTime = "No time data";
    }
    return fullTime;
}

Надеюсь, это поможет :-)

Я использую это так:

public class DateUtils {
    static DateUtils instance;
    private final DateFormat dateFormat;
    private final DateFormat timeFormat;

    private DateUtils() {
        dateFormat = android.text.format.DateFormat.getDateFormat(MainApplication.context);
        timeFormat = android.text.format.DateFormat.getTimeFormat(MainApplication.context);
    }

    public static DateUtils getInstance() {
        if (instance == null) {
            instance = new DateUtils();
        }
        return instance;
    }

    public synchronized static String formatDateTime(long timestamp) {
        long milliseconds = timestamp * 1000;
        Date dateTime = new Date(milliseconds);
        String date = getInstance().dateFormat.format(dateTime);
        String time = getInstance().timeFormat.format(dateTime);
        return date + " " + time;
    }
}

После этого: http://developer.android.com/reference/android/text/format/Time.html

Лучше использовать собственный класс времени Android:

Time now = new Time();
now.setToNow();

Затем отформатируйте:

Log.d("DEBUG", "Time "+now.format("%d.%m.%Y %H.%M.%S"));

@FireZenk: Согласно [ссылке] (developer.android.com/reference/android/text/format/Time.htm‌ l), которую вы предоставили: У этого класса есть ряд проблем, и вместо него рекомендуется использовать GregorianCalendar..

ccpizza 01.01.2015 17:30

О ... эта информация о проблеме новее, чем мой комментарий, так что это устаревший ответ

FireZenk 02.01.2015 17:59

Это мой метод, вы можете определить и формат ввода и вывода.

public static String formattedDateFromString(String inputFormat, String outputFormat, String inputDate){
    if (inputFormat.equals("")){ // if inputFormat = "", set a default input format.
        inputFormat = "yyyy-MM-dd hh:mm:ss";
    }
    if (outputFormat.equals("")){
        outputFormat = "EEEE d 'de' MMMM 'del' yyyy"; // if inputFormat = "", set a default output format.
    }
    Date parsed = null;
    String outputDate = "";

    SimpleDateFormat df_input = new SimpleDateFormat(inputFormat, java.util.Locale.getDefault());
    SimpleDateFormat df_output = new SimpleDateFormat(outputFormat, java.util.Locale.getDefault());

    // You can set a different Locale, This example set a locale of Country Mexico.
    //SimpleDateFormat df_input = new SimpleDateFormat(inputFormat, new Locale("es", "MX"));
    //SimpleDateFormat df_output = new SimpleDateFormat(outputFormat, new Locale("es", "MX"));

    try {
        parsed = df_input.parse(inputDate);
        outputDate = df_output.format(parsed);
    } catch (Exception e) { 
        Log.e("formattedDateFromString", "Exception in formateDateFromstring(): " + e.getMessage());
    }
    return outputDate;

}

Избегайте срочной даты

Java.util.Date, .Calendar и SimpleDateFormat в Java (и Android), как известно, вызывают проблемы. Избежать их. Они настолько плохи, что Sun / Oracle отказались от них, заменив их новым пакетом java.time в Java 8 (не в Android с 2014 года). Новый java.time был вдохновлен библиотекой Джода-Тайм.

Джода-Тайм

Джода-Тайм действительно работает в Android.

Поищите в StackOverflow "Joda", чтобы найти множество примеров и обсуждение.

Лакомый кусок исходного кода с использованием Joda-Time 2.4.

Стандартный формат.

String output = DateTime.now().toString(); 
// Current date-time in user's default time zone with a String representation formatted to the ISO 8601 standard.

Локализованный формат.

String output = DateTimeFormat.forStyle( "FF" ).print( DateTime.now() ); 
// Full (long) format localized for this user's language and culture.

SimpleDateFormat

Я использую SimpleDateFormat без нестандартного рисунка для получения актуальной даты и времени из системы в формате устройство предварительно выбрано:

public static String getFormattedDate() {
    //SimpleDateFormat called without pattern
    return new SimpleDateFormat().format(Calendar.getInstance().getTime());
}

возвращается:

  • 13.01.15 11:45
  • 13.01.15 10:45
  • ...

Date to Locale строка даты:

Date date = new Date();
String stringDate = DateFormat.getDateTimeInstance().format(date);

Параметры:

   DateFormat.getDateInstance() 

-> 31 декабря 1969 г.

   DateFormat.getDateTimeInstance() 

-> 31 декабря 1969 г., 16:00:00

   DateFormat.getTimeInstance() 

-> 16:00:00

Как удалить год из DateFormat.getDateInstance ()?

Hardik Joshi 08.11.2015 20:36

Слишком поздно, но может кому-то помочь

DateFormat.format(format, timeInMillis);

вот format какой формат тебе нужен

например: «ЧЧ: мм» возвращает 15:30.

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

в strings.xml:

<string name = "myDateFormat"><xliff:g id = "myDateFormat">%1$td/%1$tm/%1$tY</xliff:g></string>

В действии:

Log.d(TAG, "my custom date format: "+getString(R.string.myDateFormat, new Date()));

Это также полезно с выпуском нового Библиотека привязки даты.

Так что у меня может быть что-то вроде этого в файле макета:

<TextView
    android:id = "@+id/text_release_date"
    android:layout_width = "wrap_content"
    android:layout_height = "0dp"
    android:layout_weight = "1"
    android:padding = "2dp"
    android:text = "@{@string/myDateFormat(vm.releaseDate)}"
    tools:text = "0000"
    />

И в классе java:

    MovieDetailViewModel vm = new MovieDetailViewModel();
    vm.setReleaseDate(new Date());

Остальные ответы в целом верны. Я хотел бы предложить современный ответ. Классы Date, DateFormat и SimpleDateFormat, используемые в большинстве других ответов, давно устарели и доставляли проблемы многим программистам на протяжении многих лет. Сегодня у нас намного лучше java.time, AKA JSR-310, современный API даты и времени Java. Можете ли вы использовать это на Android? Несомненно! Современные классы были перенесены на Android в проекте ThreeTenABP. См. Все подробности в этот вопрос: Как использовать ThreeTenABP в Android Project.

Этот фрагмент должен помочь вам начать:

    int year = 2017, month = 9, day = 28, hour = 22, minute = 45;
    LocalDateTime dateTime = LocalDateTime.of(year, month, day, hour, minute);
    DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
    System.out.println(dateTime.format(formatter));

Когда я устанавливаю в качестве предпочтительного языка своего компьютера английский (США) или английский (Великобритания), печатается следующее:

Sep 28, 2017 10:45:00 PM

Когда вместо этого я установил датский язык, я получаю:

28-09-2017 22:45:00

Так что он соответствует конфигурации. Однако я не уверен, в каких деталях он соответствует настройкам даты и времени вашего устройства, и это может варьироваться от телефона к телефону.

Locale

Чтобы получить дату или время в формате локали в миллисекундах, я использовал это:

Дата и время

Date date = new Date(milliseconds);
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT, Locale.getDefault());
dateFormat.format(date);

Дата

Date date = new Date(milliseconds);
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.getDefault());
dateFormat.format(date);

Время

Date date = new Date(milliseconds);
DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.getDefault());
dateFormat.format(date);

Вы можете использовать другой стиль даты и времени. Подробнее о стилях здесь.

Этот код работает для меня!

Date d = new Date();
    CharSequence s = android.text.format.DateFormat.format("MM-dd-yy hh-mm-ss",d.getTime());
    Toast.makeText(this,s.toString(),Toast.LENGTH_SHORT).show();

Вы можете использовать DateFormat. Результат зависит от локали по умолчанию телефона, но вы также можете указать локаль:

https://developer.android.com/reference/java/text/DateFormat.html

Это результаты на

DateFormat.getDateInstance().format(date)                                          

FR Локаль: 3 ноя. 2017 г.

Регион США / Англия: 12 января 1952 г.


DateFormat.getDateInstance(DateFormat.SHORT).format(date)

FR Локаль: 11.03.2017

Регион США / En: 12.13.52


DateFormat.getDateInstance(DateFormat.MEDIUM).format(date)

FR Локаль: 3 ноя. 2017 г.

Регион США / Англия: 12 января 1952 г.


DateFormat.getDateInstance(DateFormat.LONG).format(date)

FR Локаль: 3 ноября 2017 г.

Регион США / Англия: 12 января 1952 г.


DateFormat.getDateInstance(DateFormat.FULL).format(date)

FR Locale: vendredi 3 ноября 2017 г.

Регион США / Англия: вторник, 12 апреля 1952 г.


DateFormat.getDateTimeInstance().format(date)

FR Локаль: 3 ноя. 2017 16:04:58


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(date)

FR Локаль: 11.03.2017 16:04


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM).format(date)

FR Локаль: 11.03.2017 16:04:58


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG).format(date)

FR Локаль: 11.03.2017 16:04:58 GMT + 01: 00


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.FULL).format(date)

FR Регион: 11.03.2017 16:04:58 heure normale d’Europe centrale


DateFormat.getTimeInstance().format(date)

FR Локаль: 16:04:58


DateFormat.getTimeInstance(DateFormat.SHORT).format(date)

FR Локаль: 16:04


DateFormat.getTimeInstance(DateFormat.MEDIUM).format(date)

FR Локаль: 16:04:58


DateFormat.getTimeInstance(DateFormat.LONG).format(date)

FR Локаль: 16:04:58 GMT + 01: 00


DateFormat.getTimeInstance(DateFormat.FULL).format(date)

FR Locale: 16:04:58 heure normale d’Europe centrale


Спасибо, что собрали все эти кейсы в одном месте. Если бы вы могли добавлять кейсы только на время, это сделало бы его полным справочником.

zeeshan 21.11.2017 22:05

Я спрашиваю, почему документация не такая уж строгая, большое спасибо

Perry 06.10.2020 07:05

Кратчайший путь:

// 2019-03-29 16:11
String.format("%1$tY-%<tm-%<td %<tR", Calendar.getInstance())

%tR - это сокращение от %tH:%tM, < означает повторное использование последнего параметра (1$).

Эквивалент String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM", Calendar.getInstance())

https://developer.android.com/reference/java/util/Formatter.html

Это, безусловно, самый короткий подход, хотя он не сработал для меня на Kotlin без удаления символа доллара: String.format("%1tY-%<tm-%<td %<tR", Calendar.getInstance())

Gnzlt 14.09.2020 13:30

Класс формата даты работает с чит-кодом для создания даты. Нравиться

  1. M -> 7, MM -> 07, MMM -> Jul, MMMM -> июль
  2. EEE -> Вт, EEEE -> вторник
  3. z -> EST, zzz -> EST, zzzz -> Восточное стандартное время

Вы можете проверить больше читов здесь.

Вот самый простой способ:

    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a", Locale.US);

    String time = df.format(new Date());

и если вы ищете узоры, отметьте это https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

Объяснение формата даты и времени

EEE : Day ( Mon )
MMM : Month in words ( Dec )
MM : Day in Count ( 324 )
mm : Month ( 12 )
dd : Date ( 3 )
HH : Hours ( 12 )
mm : Minutes ( 50 )
ss : Seconds ( 34 )
yyyy: Year ( 2020 ) //both yyyy and YYYY are same
YYYY: Year ( 2020 )
zzz : GMT+05:30
aa : ( AM / PM )

Заглавная ГГГГ может в некоторых случаях раздавиться, лучше использовать строчные буквы.

Kirk_hehe 28.12.2020 15:46

ЕСЛИ ВЫ НЕ ХОТИТЕ ИСПОЛЬЗОВАТЬ SIMPLEDATEFORMATTER

fun formatt(date : Date?): String{
    val datef = this.Alarmdate
    val myformatter  = android.text.format.DateFormat.format(" HH:mm EE, dd MMM", datef)
    return myformatter.toString()
}

использовать это

android.text.format.DateFormat.format(" HH:mm EE, dd MMM", datef)

первый параметр - это строка настраиваемого формата, второй параметр - это дата, которую вы хотите отформатировать.

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