Data do calendário no formato aaaa-MM-dd em java

210

Como converter a data do calendário em yyyy-MM-ddformato.

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 1);
Date date = cal.getTime();             
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
String date1 = format1.format(date);            
Date inActiveDate = null;
try {
    inActiveDate = format1.parse(date1);
} catch (ParseException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

Isso irá produzir inActiveDate = Wed Sep 26 00:00:00 IST 2012. Mas o que eu preciso é 2012-09-26. Meu objetivo é comparar esta data com outra data no meu banco de dados usando os critérios do Hibernate. Então, eu preciso do objeto de data no yyyy-MM-ddformato.

Sarika.S
fonte
5
Seu código é confuso. Você está tentando formatar um Datepara yyyy-MM-ddou analisar uma String de yyyy-MM-ddpara um Datevalor? Para formatar a data, simplesmente uso format1.format(date), para analisá-lo, useformat1.parse(someStringValueInTheCorrectFormat)
MadProgrammer
Eu editei a minha pergunta .. Desculpe o erro anterior ..
Sarika.S
9
um liner:( new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" ) ).format( Calendar.getInstance().getTime() );
Iwan Aucamp

Respostas:

342

Um Java Dateé um contêiner para o número de milissegundos desde 1 de janeiro de 1970, 00:00:00 GMT.

Quando você usa algo como System.out.println(date), Java usa Date.toString()para imprimir o conteúdo.

A única maneira de mudar isso é substituir Datee fornecer sua própria implementação Date.toString(). Agora, antes que você inicie seu IDE e tente isso, eu não faria; isso apenas complicará as coisas. É melhor formatar a data para o formato que você deseja usar (ou exibir).

Java 8+

LocalDateTime ldt = LocalDateTime.now().plusDays(1);
DateTimeFormatter formmat1 = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.ENGLISH);
System.out.println(ldt);
// Output "2018-05-12T17:21:53.658"

String formatter = formmat1.format(ldt);
System.out.println(formatter);
// 2018-05-12

Antes do Java 8

Você deve fazer uso do ThreeTen Backport

O seguinte é mantido para fins históricos (como a resposta original)

O que você pode fazer é formatar a data.

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 1);
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(cal.getTime());
// Output "Wed Sep 26 14:23:28 EST 2012"

String formatted = format1.format(cal.getTime());
System.out.println(formatted);
// Output "2012-09-26"

System.out.println(format1.parse(formatted));
// Output "Wed Sep 26 00:00:00 EST 2012"

Na verdade, são a mesma data, representada de maneira diferente.

MadProgrammer
fonte
1
Tipo de, mas é muito mais fácil comCalendar
MadProgrammer
1
Enfim, para remover completamente o fuso horário deste objeto de calendário?
Sarika.S
2
Se você for realmente sério sobre a data / manipulação do tempo, dê uma olhada Joda Tempo , é significativamente mais fácil, em seguida, brincando comCalendar
MadProgrammer
2
@ n13 se a pergunta era sobre manipulação de datas no banco de dados ou mesmo manipulação de tempo, eu concordo com você. A questão era como para representar um valor de data em particular formato de data
MadProgrammer
1
Resposta bem estruturada - essa é basicamente a separação de Modelo (Data) - Visão (Formato).
YoYo
19

Seu código está errado. Não adianta analisar a data e mantê-la como objeto Date.

Você pode formatar o objeto de data do calendário quando desejar exibir e mantê-lo como uma sequência.

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 1);
Date date = cal.getTime();             
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");          
String inActiveDate = null;
try {
    inActiveDate = format1.format(date);
    System.out.println(inActiveDate );
} catch (ParseException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}
Niroshan Abayakoon
fonte
13

java.time

A resposta do MadProgrammer está correta, especialmente a dica sobre o Joda-Time . O sucessor do Joda-Time agora está embutido no Java 8 como o novo pacote java.time . Aqui está o código de exemplo no Java 8.

Ao trabalhar com data e hora (em oposição à data local), o fuso horário é crítico. O dia do mês depende do fuso horário. Por exemplo, o fuso horário da Índia é +05:30(cinco horas e meia antes do UTC), enquanto a França está apenas uma hora à frente. Assim, um momento em um novo dia na Índia tem uma data, enquanto o mesmo momento na França tem a data de “ontem”. Criar saída de string sem qualquer fuso horário ou informações de deslocamento está criando ambiguidade. Você pediu a saída AAAA-MM-DD, então eu forneci, mas não a recomendo. Em vez de ISO_LOCAL_DATEeu teria usado ISO_DATEpara obter esta saída:2014-02-25+05:30

ZoneId zoneId = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zonedDateTime = ZonedDateTime.now( zoneId );

DateTimeFormatter formatterOutput = DateTimeFormatter.ISO_LOCAL_DATE; // Caution: The "LOCAL" part means we are losing time zone information, creating ambiguity.
String output = formatterOutput.format( zonedDateTime );

Despejar no console…

System.out.println( "zonedDateTime: " + zonedDateTime );
System.out.println( "output: " + output );

Quando correr ...

zonedDateTime: 2014-02-25T14:22:20.919+05:30[Asia/Kolkata]
output: 2014-02-25

Joda-Time

Código semelhante usando a biblioteca Joda-Time , o precursor de java.time.

DateTimeZone zone = new DateTimeZone( "Asia/Kolkata" );
DateTime dateTime = DateTime.now( zone );
DateTimeFormatter formatter = ISODateTimeFormat.date();
String output = formatter.print( dateTime );

ISO 8601

A propósito, esse formato da sua string de entrada é um formato padrão, um dos vários formatos úteis de string de data e hora definidos pela ISO 8601 .

Joda-Time e java.time usam os formatos ISO 8601 por padrão ao analisar e gerar representações de sequência de vários valores de data e hora.

Basil Bourque
fonte
6

java.util.DateO objeto não pode representar a data no formato personalizado . Você deve usar o SimpleDateFormat.formatmétodo que retorna string.

String myString=format1.format(date);
adatapost
fonte
2

Para analisar um java.util.Dateobjeto, você deve convertê-lo em String primeiro, usando seu próprio formato.

inActiveDate = format1.parse(  format1.format(date)  );

Mas acredito que você está sendo redundante aqui.

ElderMael
fonte
2
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 7);
Date date = c.getTime();
SimpleDateFormat ft = new SimpleDateFormat("MM-dd-YYYY");
JOptionPane.showMessageDialog(null, ft.format(date));

Isso exibirá sua data + 7 dias no formato mês, dia e ano em um painel da janela JOption.

Desenhou
fonte
2
public static void main(String[] args) {
    Calendar cal = Calendar.getInstance();
    cal.set(year, month, date);
    SimpleDateFormat format1 = new SimpleDateFormat("yyyy MM dd");
    String formatted = format1.format(cal.getTime());
    System.out.println(formatted);
}
Petr
fonte
2
Bem-vindo ao SO. Adicione algum contexto / explicação, pois as respostas apenas por código não atendem aos nossos padrões. Veja stackoverflow.com/help/how-to-answer
Uwe Allner
0

Encontrei este código em que a data é comparada em um formato para comparar com o campo de data no banco de dados ... pode ser que isso possa ser útil para você ...

Quando você converte a string em data usando simpledateformat, é difícil comparar com o campo Data nos bancos de dados mysql.

Portanto, converta a data da string java no formato usando selecione STR_to_DATE ('sua data', '% m /% d /% Y') -> neste formato, para obter o formato exato da data do campo mysql date.

http://javainfinite.com/java/java-convert-string-to-date-and-compare/

JavaLearner
fonte
3
As respostas somente para links são desencorajadas no StackOverflow devido a rot-link e outros problemas. Você pode dar um resumo das informações com pontos-chave?
Basil Bourque
0
public static String ThisWeekStartDate(WebDriver driver) {
        Calendar c = Calendar.getInstance();
        //ensure the method works within current month
        c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        System.out.println("Before Start Date " + c.getTime());
        Date date = c.getTime();

          SimpleDateFormat dfDate = new SimpleDateFormat("dd MMM yyyy hh.mm a");

          String CurrentDate = dfDate.format(date);
          System.out.println("Start Date " + CurrentDate);
          return CurrentDate;

    }
    public static String ThisWeekEndDate(WebDriver driver) {

        Calendar c = Calendar.getInstance();
        //ensure the method works within current month
        c.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
        System.out.println("Before End Date " + c.getTime());
        Date date = c.getTime();

          SimpleDateFormat dfDate = new SimpleDateFormat("dd MMM yyyy hh.mm a");

          String CurrentDate = dfDate.format(date);
          System.out.println("End Date " + CurrentDate);
          return CurrentDate;
    }
Unnati Solanki
fonte