Como formatar data e hora no Android?

321

Como formatar corretamente de acordo com a data e a hora da configuração do dispositivo, tendo um ano, mês, dia, hora e minuto?

pupeno
fonte

Respostas:

291

Use a classe Java DateFormat padrão.

Por exemplo, para exibir a data e hora atuais, faça o seguinte:

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

Você pode inicializar um objeto Date com seus próprios valores, no entanto, você deve estar ciente de que os construtores foram descontinuados e realmente deve usar um objeto Java Calendar.

JamieH
fonte
42
Este é o android.text.format.DateFormat, em vez de java.text.DateFormat.
jamesh
4
É bastante típico do Android IME ter duas classes que afirmam fornecer um resultado definido como o local padrão, mas uma não. Então, sim, não se esqueça de usar a versão android.text.format do DateFormat (que nem deriva o LOL do java.util one).
Mxcl
22
Por favor note que essa linha: DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());O dateFormat retornado é do tipo java.text.DateFormat(e NÃO android.text.format.DateFormat)
Arye Rosenstein
2
@Harsha - para contornar esse problema, eu uso o DateFormat em cadeia, então só preciso fazer referência à classe Android e, portanto, não há classes ambíguas. final String dateStr = DateFormat.getDateFormat (this) .format (d); Você pode usar o método format () do Android e ter um código de limpeza (IMHO) e um objeto a menos para instanciar.
Jerry Brady
23
Este formatador inclui apenas a data, não a hora como a pergunta original afirmou. Em vez disso, use o DateUtils do mesmo pacote, consulte stackoverflow.com/questions/2983920/…
Asmo Soinio
203

Na minha opinião, android.text.format.DateFormat.getDateFormat(context)me deixa confuso porque esse método retorna em java.text.DateFormatvez de android.text.format.DateFormat- - ".

Então, eu uso o código do fragmento como abaixo para obter a data / hora atual no meu formato.

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());

Além disso, você pode usar outros formatos. Siga DateFormat .

Fuangwith S.
fonte
21
Útil, mas a pergunta dizia "de acordo com a configuração do dispositivo". Para mim, isso implica usar um formato escolhido com base no idioma / país do usuário ou escolhido diretamente pelo usuário, em vez de codificar a escolha do formato.
Chris Boyle
17
Também, não se esqueça que hh:mm:sslhe dará 01:00:00para 01:00, você vai precisar usar kk:mm:sspara obter13:00:00
dnet
2
@dnet ké hora no dia (1-24), não quer dizer H, que é hora no dia (0-23), por exemplo. HH: mm: ss? Veja: developer.android.com/reference/java/text/SimpleDateFormat.html
Joony
1
@Joony não, não há diferença entre java.text.SimpleDateFormat(o que você ligada e usos Hpara horas na faixa de 0-23) e android.text.format.DateFormat(o que a resposta é sobre e usos kpara horas no 0-23 range)
dnet
@dnet Após o teste, você está correto sobre ka documentação dos DateFormatestados claros. Para a documentação canônica de cadeias de formato, consulte SimpleDateFormat. Muito confuso. Ou eu estou esquecendo de alguma coisa?
Joony
145

Você pode usar DateFormat. O resultado depende da Localidade padrão do telefone, mas você também pode especificar Localidade:

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

Isso resulta em um

DateFormat.getDateInstance().format(date)                                          

Localidade FR: 3 nov. 2017

US / En Locale: 12 de janeiro de 1952


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

FR Local: 03/11/2017

Local dos EUA / em: 12.13.52


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

Localidade FR: 3 nov. 2017

US / En Locale: 12 de janeiro de 1952


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

Local da FR: 3 de novembro de 2017

Local dos EUA / em: 12 de janeiro de 1952


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

FR Local: sexta-feira, 3 de novembro de 2017

US / En Locale: terça-feira, 12 de abril de 1952


DateFormat.getDateTimeInstance().format(date)

Localidade FR: 3 nov. 2017 16:04:58


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

FR Local: 03/11/2017 16:04


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

FR Local: 03/11/2017 16:04:58


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

Local da FR: 11/11/2017 16:04:58 GMT + 01: 00


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

FR Local: 03/11/2017 16:04:58 heure normale d'Europe centrale


DateFormat.getTimeInstance().format(date)

FR Local: 16:04:58


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

FR Local: 16:04


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

FR Local: 16:04:58


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

Local da FR: 16:04:58 GMT + 01: 00


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

FR Local: 16:04:58 heure normale d'Europe centrale


Dany Pop
fonte
4
Obrigado por colocar todos esses casos em um só lugar. Se você puder adicionar casos apenas por tempo, isso fará com que seja uma referência completa.
zeeshan
41

Date to Locale string de data:

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

Opções:

   DateFormat.getDateInstance() 

-> 31 de dezembro de 1969

   DateFormat.getDateTimeInstance() 

-> 31 de dezembro de 1969 16:00:00

   DateFormat.getTimeInstance() 

-> 16:00:00

Ivo Stoyanov
fonte
3
Como remover o ano de DateFormat.getDateInstance ()?
Hardik Joshi
21

Isso fará isso:

Date date = new Date();
java.text.DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
mTimeText.setText("Time: " + dateFormat.format(date));
tronman
fonte
Isso será localizado quando o usuário alterar o idioma em um dispositivo Android?
Kannan_SJD
14

Use SimpleDateFormat

Como isso:

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

SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
Date date = format.parse(bundle.getString("starttime"));
neknek mouh
fonte
5
Sim, com localidade padrão para problemas de desempenho evitar:new SimpleDateFormat("my-format", Locale.getDefault());
iutinvg
14

Após isso: http://developer.android.com/reference/android/text/format/Time.html

É melhor usar a classe Time nativa do Android:

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

Depois formate:

Log.d("DEBUG", "Time "+now.format("%d.%m.%Y %H.%M.%S"));
FireZenk
fonte
1
@FireZenk: De acordo com o [link] ( developer.android.com/reference/android/text/format/Time.html ) que você forneceu: Esta classe tem vários problemas e é recomendável que GregorianCalendar seja usado .
Ccpizza
Oh ... esta questão-info é mais recente do que o meu comentário, de modo que é uma resposta obsoleto
FireZenk
10

Use essas duas como variáveis ​​de classe:

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

E use-o assim:

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

Este é o meu método, você pode definir e formato de entrada e saída.

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;

}
Jorgesys
fonte
8

SimpleDateFormat

Uso SimpleDateFormat sem padrão personalizado para obter a data e hora reais do sistema no formato pré-selecionado do dispositivo :

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

retorna :

  • 13.01.15 11:45
  • 13/1/15 10:45
  • ...
Tomas
fonte
7

Use build na classe Time!

Time time = new Time();
time.set(0, 0, 17, 4, 5, 1999);
Log.i("DateTime", time.format("%d.%m.%Y %H:%M:%S"));
Igor Krumpak
fonte
Esta é a solução ideal porque ele usa o objeto Time leve do Quadro Android: developer.android.com/reference/android/text/format/Time.html
Dean selvagem
13
Essa não é a solução ideal: ela não respeita o formato da data do código do idioma do usuário.
21713 Dan Hulme
5

As outras respostas estão geralmente corretas. Eu gostaria de contribuir com a resposta moderna. As aulas Date, DateFormate SimpleDateFormatusadas na maioria das outras respostas, estão desatualizadas há muito tempo e causaram problemas para muitos programadores ao longo de muitos anos. Hoje temos muito melhor java.time, o AKA JSR-310, a moderna API de data e hora de Java. Você já pode usar isso no Android? Certamente! As classes modernas foram portadas para o Android no projeto ThreeTenABP. Veja esta pergunta: Como usar o ThreeTenABP no Android Project para obter todos os detalhes.

Este snippet deve começar:

    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));

Quando defino o idioma preferido do meu computador para inglês dos EUA ou inglês do Reino Unido, isso imprime:

Sep 28, 2017 10:45:00 PM

Quando em vez disso, defino-o como dinamarquês, recebo:

28-09-2017 22:45:00

Por isso, segue a configuração. No entanto, não sei exatamente quais detalhes seguem as configurações de data e hora do seu dispositivo, e isso pode variar de telefone para telefone.

Ole VV
fonte
5

Este código funciona para mim!

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();
Shahzad Afridi
fonte
5

A classe de formato de data trabalha com código de fraude para criar a data. Gostar

  1. M -> 7, MM -> 07, MMM -> julho, MMMM -> julho
  2. EEE -> ter, EEEE -> terça-feira
  3. z -> EST, zzz -> EST, zzzz -> Horário Padrão do Leste

Você pode conferir mais truques aqui .

Sunil
fonte
4

Este código retornaria a data e hora atuais:

public String getCurrDate()
{
    String dt;
    Date cal = Calendar.getInstance().getTime();
    dt = cal.toLocaleString();
    return dt;
}
chetan
fonte
1
toLocaleString () está obsoleto
nspo 28/03
4

Localidade

Para obter a data ou hora no formato de localidade em milissegundos, usei o seguinte:

Data e hora

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

Encontro

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

Tempo

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

Você pode usar outro estilo de data e hora. Mais informações sobre estilos aqui .

Wojtek
fonte
4

Maneira mais curta:

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

%tRé abreviação de %tH:%tM, <significa reutilizar o último parâmetro ( 1$).

É equivalente a String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM", Calendar.getInstance())

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

k8C
fonte
2

Experimentar:

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

E quando você está acessando variáveis ​​passadas:

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
Date date = formatter.parse(bundle.getString("startTime"));
Abhishek Singh Rathaur
fonte
2

Eu uso assim:

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;
    }
}
ViliusK
fonte
1

Evite juDate

O Java.util.Date e .Calendar e SimpleDateFormat em Java (e Android) são notoriamente problemáticos. Evite-os. Eles são tão ruins que a Sun / Oracle desistiu deles, substituindo-os com o novo pacote java.time no Java 8 (não no Android a partir de 2014). O novo java.timefoi inspirado na biblioteca Joda-Time .

Joda-Time

O Joda-Time funciona no Android.

Pesquise StackOverflow por "Joda" para encontrar muitos exemplos e muita discussão.

Um pedacinho de código fonte usando o Joda-Time 2.4.

Formato padrão.

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

Formato localizado.

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

De volta a 2016, quando desejo personalizar o formato (não de acordo com a configuração do dispositivo, como você pergunta ...), geralmente uso o arquivo de recursos da string:

em strings.xml:

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

Em Atividade:

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

Isso também é útil com o lançamento da nova biblioteca de vinculação de datas .

Para que eu possa ter algo assim no arquivo de layout:

<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"
    />

E na classe java:

    MovieDetailViewModel vm = new MovieDetailViewModel();
    vm.setReleaseDate(new Date());
alexpfx
fonte
0

A classe Time do Android fornece três métodos de formatação http://developer.android.com/reference/android/text/format/Time.html

Foi assim que eu fiz:

/**
* 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;
}

Espero que seja útil :-)

Broo
fonte
0

É tarde demais, mas pode ajudar alguém

DateFormat.format(format, timeInMillis);

aqui formatestá o formato que você precisa

ex: "HH: mm" retorna 15:30

subrahmanyam boyapati
fonte