Converter java.util.Date em String

407

Eu quero converter um java.util.Dateobjeto para um Stringem Java.

O formato é 2010-05-30 22:15:52

novicePrgrmr
fonte
@harschware FYI, o projeto Joda-Time agora está no modo de manutenção , com a equipe aconselhando a migração para as classes java.time . Consulte o Tutorial da Oracle .
Basil Bourque
1
Eu recomendo que você não use e Dateem 2019. Essa classe é mal projetada e desatualizada há muito tempo. Em vez disso, use Instantou outra classe de java.time, a moderna API de data e hora de Java .
Ole VV

Respostas:

757

Converta uma Data em uma String usando o DateFormat#formatmétodo:

String pattern = "MM/dd/yyyy HH:mm:ss";

// Create an instance of SimpleDateFormat used for formatting 
// the string representation of date according to the chosen pattern
DateFormat df = new SimpleDateFormat(pattern);

// Get the today date using Calendar object.
Date today = Calendar.getInstance().getTime();        
// Using DateFormat format method we can create a string 
// representation of a date with the defined format.
String todayAsString = df.format(today);

// Print the result!
System.out.println("Today is: " + todayAsString);

Em http://www.kodejava.org/examples/86.html

Ali Ben Messaoud
fonte
25
por que usar em Calendarvez de simples new Date()? Existe diferença?
Alexander Malakhov
10
Cuidado: SimpleDateFormat não é seguro para threads. stackoverflow.com/questions/6840803/…
Zags
23
O calendário é uma classe abstrata, a data é concreta. Date não tem idéia sobre TimeZone, Locale ou qualquer coisa boa que todos nós nunca usamos.
Nckbrz 13/03/2014
30
O MM/dd/yyyyformato é estúpido e quebrado. Não use isso. Sempre use dd/MM/yyyyou yyyy-MM-dd.
SystemParadox
13
@ SystemParadox - É estúpido, mas isso não faz sentido. Pediram-me especificamente para usá-lo porque corresponde ao que as pessoas esperam nos relatórios. (Eu preferiria em yyyy-MM-ddqualquer lugar, mas o que você pode fazer?).
Autumn Leonard
223
Format formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = formatter.format(date);
Charlie Salts
fonte
63

O Commons-lang DateFormatUtils está cheio de guloseimas (se você tiver commons-lang em seu caminho de classe)

//Formats a date/time into a specific pattern
 DateFormatUtils.format(yourDate, "yyyy-MM-dd HH:mm:SS");
webpat
fonte
Requer uma nullverificação adicional .
Farrukh Chishti 8/04
23

tl; dr

myUtilDate.toInstant()  // Convert `java.util.Date` to `Instant`.
          .atOffset( ZoneOffset.UTC )  // Transform `Instant` to `OffsetDateTime`.
          .format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )  // Generate a String.
          .replace( "T" , " " )  // Put a SPACE in the middle.

2014-11-14 14:05:09

java.time

A maneira moderna é com as classes java.time que agora substituem as antigas classes problemáticas de data e hora herdadas.

Primeiro converta seu java.util.Datepara um Instant. A Instantclasse representa um momento na linha do tempo no UTC com uma resolução de nanossegundos (até nove (9) dígitos de uma fração decimal).

Conversões de / para java.time são executadas por novos métodos adicionados às classes antigas.

Instant instant = myUtilDate.toInstant();

Tanto o seu java.util.Datecomo o java.time.Instantestão no UTC . Se você deseja ver a data e a hora como UTC, que assim seja. Chame toStringpara gerar uma String no formato ISO 8601 padrão.

String output = instant.toString();  

2014-11-14T14: 05: 09Z

Para outros formatos, você precisa transformar o seu Instantem mais flexível OffsetDateTime.

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

odt.toString (): 2020-05-01T21: 25: 35.957Z

Veja esse código executado ao vivo em IdeOne.com .

Para obter uma String no formato desejado, especifique a DateTimeFormatter. Você pode especificar um formato personalizado. Mas eu usaria um dos formatadores predefinidos ( ISO_LOCAL_DATE_TIME) e substituiria o Tresultado em um SPACE.

String output = odt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " );

2014-11-14 14:05:09

A propósito, eu não recomendo esse tipo de formato em que você propositadamente perde as informações de deslocamento do UTC ou do fuso horário. Cria ambiguidade quanto ao significado do valor de data e hora dessa sequência.

Também tenha cuidado com a perda de dados, pois qualquer segundo fracionário está sendo ignorado (efetivamente truncado) na representação da String do valor de data e hora.

Para ver o mesmo momento pelas lentes do relógio de parede de uma determinada região , aplique a ZoneIdpara obter a ZonedDateTime.

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

zdt.toString (): 2014-11-14T14: 05: 09-05: 00 [America / Montreal]

Para gerar uma String formatada, faça o mesmo que acima, mas substitua odtpor zdt.

String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " );

2014-11-14 14:05:09

Se você executar esse código várias vezes, convém ser um pouco mais eficiente e evitar a chamada para String::replace. Interromper essa chamada também reduz seu código. Se desejar, especifique seu próprio padrão de formatação em seu próprio DateTimeFormatterobjeto. Coloque em cache esta instância como uma constante ou membro para reutilização.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" );  // Data-loss: Dropping any fractional second.

Aplique esse formatador passando a instância.

String output = zdt.format( f );

Sobre java.time

A estrutura java.time é integrada ao Java 8 e posterior. Essas classes suplantar as classes de data e hora velhos complicados, como java.util.Date, .Calendar, ejava.text.SimpleDateFormat .

O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para java.time.

Para saber mais, consulte o Tutorial do Oracle . E procure Stack Overflow para muitos exemplos e explicações.

Grande parte da funcionalidade java.time é portada para Java 6 e 7 no ThreeTen-Backport e adaptada ainda mais ao Android no ThreeTenABP (consulte Como usar ... ).

O projeto ThreeTen-Extra estende o java.time com classes adicionais. Este projeto é um campo de prova para possíveis adições futuras ao java.time.

Basil Bourque
fonte
Aqui estão exemplos de código de formatação com a API do Java 8 Time: stackoverflow.com/a/43457343/603516
Vadzim 17/04/2017
esse código não funciona OffsetDateTime odt = instant.atOffset (ZoneOffset.UTC); odt.toString (): 2014-11-14T14: 05: 09 + 00: 00 Existe um novo código Java 8 para ter o mesmo formato 2014-11-14T14: 05: 09 + 00: 00? Obrigado
Bob Bolden
@BobBolden Você está correto, Zé usado em vez de +00:00por padrão. Corrigi a resposta, obrigado. Para sua informação, significam a mesma coisa Z:, pronunciado “Zulu” significa um deslocamento de zero horas-minutos-segundos, o mesmo que +00:00. O padrão ISO 8601 suporta os dois estilos.
Basil Bourque
@BasilBourque desculpe, isso não está claro. Eu tenho o Java 8 e não há instant.atOffset (). Você poderia aconselhar qual deveria ser o código correto para o Java 8 ter exatamente o mesmo formato 2014-11-14T14: 05: 09 + 00: 00 sem instant.atOffset ()? Estou um pouco perdido :(
Bob Bolden
@BobBolden Há de fato um atOffsetmétodo de Instantclasse em Java 8. Ver Javadoc: Instant::atOffset. No Java 8, uma chamada como Instant.now().atOffset( ZoneOffset.UTC ).toString()será executada. Verifique suas importdeclarações. Verifique se o seu IDE / projeto está definido para executar o Java 8 ou posterior, em vez de uma versão anterior do Java. Veja o código executado ao vivo em IdeOne.com: ideone.com/2Vm2O5
Basil Bourque
19

One-liners alternativos em java simples:

String.format("The date: %tY-%tm-%td", date, date, date);

String.format("The date: %1$tY-%1$tm-%1$td", date);

String.format("Time with tz: %tY-%<tm-%<td %<tH:%<tM:%<tS.%<tL%<tz", date);

String.format("The date and time in ISO format: %tF %<tT", date);

Este usa Formatter e relativa indexação em vez de SimpleDateFormatque é não thread-safe , btw.

Um pouco mais repetitivo, mas precisa de apenas uma declaração. Isso pode ser útil em alguns casos.

Vadzim
fonte
1
Isso é (in) gênio. Desempenho muito melhor para ambientes restritos
Ruslan
9

Por que você não usa o Joda (org.joda.time.DateTime)? É basicamente uma linha.

Date currentDate = GregorianCalendar.getInstance().getTime();
String output = new DateTime( currentDate ).toString("yyyy-MM-dd HH:mm:ss");

// output: 2014-11-14 14:05:09
dbow
fonte
Sugiro que passe também um DateTimeZone, em vez de atribuir o fuso horário padrão atual da JVM ao DateTimeobjeto. new DateTime( currentDate , DateTimeZone.forID( "America/Montreal" ) )
Basil Bourque
7

Parece que você está procurando por SimpleDateFormat .

Formato: aaaa-MM-dd kk: mm: ss

pickypg
fonte
O "kk" faz algo especial? Acho que Eric quer isso em 24 horas.
Charlie Sais
2
Sim, a hora do dia (1-24), mas provavelmente não é o que o OP precisa. HH(0-23) é mais comum.
BalusC
1
@Cahrlie Salts kk vai de 1-24, onde HH vai de 0-23, e provavelmente foi um pouco presunçoso da minha parte supor que ele quisesse 1-24 @BalusC O objeto DateFormat analisa e formata.
pickypg
Não entendo a relevância do seu último comentário. Meu comentário foi para Charlie.
BalusC
Estou acostumado aos formatos .Net, onde HH é 24 horas e hh é am / pm. Daí o coçar a cabeça.
Charlie Sais
5

Em um único tiro;)

Para obter a data

String date = new SimpleDateFormat("yyyy-MM-dd",   Locale.getDefault()).format(new Date());

Para obter o tempo

String time = new SimpleDateFormat("hh:mm", Locale.getDefault()).format(new Date());

Para obter a data e hora

String dateTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.getDefaut()).format(new Date());

Feliz codificação :)

Chanaka Fernando
fonte
1
FYI, os incômodos aulas em tempo data antigas, tais como java.util.Date, java.util.Calendare java.text.SimpleDateFormatestão agora legado , suplantado pelos java.time classes internas em Java 8 & Java 9. Consulte Tutorial pela Oracle .
Basil Bourque
4
public static String formateDate(String dateString) {
    Date date;
    String formattedDate = "";
    try {
        date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss",Locale.getDefault()).parse(dateString);
        formattedDate = new SimpleDateFormat("dd/MM/yyyy",Locale.getDefault()).format(date);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return formattedDate;
}
Ashish Tiwari
fonte
4

A maneira mais fácil de usá-lo é a seguinte:

currentISODate = new Date().parse("yyyy-MM-dd'T'HH:mm:ss", "2013-04-14T16:11:48.000");

onde "aaaa-MM-dd'T'HH: mm: ss" é o formato da data de leitura

saída: dom 14 abr 16:11:48 EEST 2013

Notas: HH vs hh - HH refere-se ao formato de 24h - hh refere-se ao formato de 12h

Rami Sharaiyri
fonte
A questão é sobre conversão oposta.
Vadzim
4

Se você precisar apenas da hora a partir da data, poderá usar o recurso String.

Date test = new Date();
String dayString = test.toString();
String timeString = dayString.substring( 11 , 19 );

Isso cortará automaticamente a parte do tempo da String e a salvará dentro da timeString.

funaquarius24
fonte
Isso pode ocorrer com localidades diferentes.
Vadzim
4

Aqui estão exemplos de uso da nova API Java 8 Time para formatar legado java.util.Date :

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS Z")
        .withZone(ZoneOffset.UTC);
    String utcFormatted = formatter.format(date.toInstant()); 

    ZonedDateTime utcDatetime = date.toInstant().atZone(ZoneOffset.UTC);
    String utcFormatted2 = utcDatetime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS Z"));
    // gives the same as above

    ZonedDateTime localDatetime = date.toInstant().atZone(ZoneId.systemDefault());
    String localFormatted = localDatetime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
    // 2011-12-03T10:15:30+01:00[Europe/Paris]

    String nowFormatted = LocalDateTime.now().toString(); // 2007-12-03T10:15:30.123

É bom DateTimeFormatterque ele possa ser armazenado em cache de maneira eficiente, pois é seguro para threads (ao contrário SimpleDateFormat).

Lista de adaptadores predefinidos e referência de notação de padrão .

Créditos:

Como analisar / formatar datas com LocalDateTime? (Java 8)

Java8 conversão java.util.Date para java.time.ZonedDateTime

Formatar Instantâneo para String

Qual é a diferença entre jon 8 ZonedDateTime e OffsetDateTime?

Vadzim
fonte
2

Tente isso,

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Date
{
    public static void main(String[] args) 
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String strDate = "2013-05-14 17:07:21";
        try
        {
           java.util.Date dt = sdf.parse(strDate);         
           System.out.println(sdf.format(dt));
        }
        catch (ParseException pe)
        {
            pe.printStackTrace();
        }
    }
}

Resultado:

2013-05-14 17:07:21

Para mais informações sobre a formatação de data e hora em java, consulte os links abaixo

Centro de Ajuda da Oracle

Exemplo de data e hora em java

Shiva
fonte
1
public static void main(String[] args) 
{
    Date d = new Date();
    SimpleDateFormat form = new SimpleDateFormat("dd-mm-yyyy hh:mm:ss");
    System.out.println(form.format(d));
    String str = form.format(d); // or if you want to save it in String str
    System.out.println(str); // and print after that
}
Artanis
fonte
1

Vamos tentar isso

public static void main(String args[]) {

    Calendar cal = GregorianCalendar.getInstance();
    Date today = cal.getTime();
    DateFormat df7 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    try {           
        String str7 = df7.format(today);
        System.out.println("String in yyyy-MM-dd format is: " + str7);          
    } catch (Exception ex) {
      ex.printStackTrace();
    }
}

Ou uma função utilitária

public String convertDateToString(Date date, String format) {
    String dateStr = null;
    DateFormat df = new SimpleDateFormat(format);

    try {
        dateStr = df.format(date);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return dateStr;
}

De converter data em string em Java

David Pham
fonte
1
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String date = "2010-05-30 22:15:52";
    java.util.Date formatedDate = sdf.parse(date); // returns a String when it is parsed
    System.out.println(sdf.format(formatedDate)); // the use of format function returns a String
Dulith De Costa
fonte
1
Date date = new Date();
String strDate = String.format("%tY-%<tm-%<td %<tH:%<tM:%<tS", date);
jujuBee
fonte
1

Opção de uma linha

Esta opção recebe uma linha fácil para escrever a data real.

Observe que isso está usando Calendar.classe SimpleDateFormat, e não é lógico usá-lo no Java8.

yourstringdate =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());
Alejandro Teixeira Muñoz
fonte
1
FYI, os terrivelmente problemáticas aulas de data e hora, como java.util.Date, java.util.Calendar, e java.text.SimpleDateFormatsão agora legado , suplantado pelos java.time classes internas em Java 8 e posterior. Consulte o Tutorial da Oracle .
Basil Bourque
1
(1) A resposta está errada (acabei de receber 2019-20-23 09:20:22- mês 20 ??) (2) Não vejo que a resposta fornece algo que ainda não foi abordado em outras respostas. (3) Por favor, não ensine os jovens a usar a SimpleDateFormataula desatualizada e notoriamente problemática . Pelo menos não como a primeira opção. E não sem nenhuma reserva. Hoje temos muito melhor na java.timemoderna API de data e hora de Java, e suas DateTimeFormatter.
Ole VV
Sim ... cometi um erro e esqueci de corrigi-lo. Adicionei de maneira rápida e não lembrei .. desculpe !! e obrigado por seus comentários pessoal
Alejandro Teixeira Muñoz
@ OleV.V. Nem todo mundo tem acesso aos dados e tempo de api Java Modern ...... assim ... É também válida esta resposta ...
Alejandro Teixeira Muñoz
1
Obrigado por seu comentário. Se você deseja fornecer uma resposta para Java 5 ou Java 6 e 7 sem nenhuma dependência externa, muito bem, isso é bem-vindo, apenas explique que é isso que você está fazendo. E sua resposta ainda está errada, você terá surpresas no Ano Novo.
Ole VV