Alterar o formato da data em uma sequência Java


465

Eu tenho uma Stringrepresentação de uma data.

String date_s = "2011-01-18 00:00:00.0";

Eu gostaria de convertê-lo para um Datee produzi-lo em YYYY-MM-DDformato.

18/01/2011

Como posso conseguir isso?


Ok, com base nas respostas que recuperei abaixo, eis uma coisa que tentei:

String date_s = " 2011-01-18 00:00:00.0"; 
SimpleDateFormat dt = new SimpleDateFormat("yyyyy-mm-dd hh:mm:ss"); 
Date date = dt.parse(date_s); 
SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd");
System.out.println(dt1.format(date));

Mas ele gera em 02011-00-1vez do desejado 2011-01-18. O que estou fazendo errado?


163
aaaaa não é o mesmo que aaaa. :)
Hovercraft Cheio De Enguias

2
Uma pergunta bumerangue. Qual é o seu caso de uso? Porque é possível que você use padrões internos (DateFormat.getDateTimeInstance ()).
Paweł Dyda 23/01

11
O mês é representado com MM na string de formato, não com mm, como nos exemplos acima. mm significa minutos.
Mike

3
Mudei aaaa-mm-dd e AAAA-MM-DD, causa versão inicial não funcionou
Pavlo Zvarych

Respostas:


506

Use LocalDateTime#parse()(ou ZonedDateTime#parse()se a sequência contiver uma parte do fuso horário) para analisar umString em um determinado padrão em a LocalDateTime.

String oldstring = "2011-01-18 00:00:00.0";
LocalDateTime datetime = LocalDateTime.parse(oldstring, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"));

Use LocalDateTime#format()(ou ZonedDateTime#format()) para formatar a LocalDateTimeem um Stringem um determinado padrão.

String newstring = datetime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
System.out.println(newstring); // 2011-01-18

Ou , quando você ainda não estiver no Java 8, use SimpleDateFormat#parse()para analisar a Stringem um determinado padrão em umaDate .

String oldstring = "2011-01-18 00:00:00.0";
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").parse(oldstring);

Use SimpleDateFormat#format()para formatar a DateemString em um determinado padrão.

String newstring = new SimpleDateFormat("yyyy-MM-dd").format(date);
System.out.println(newstring); // 2011-01-18

Veja também:


Atualização : conforme sua tentativa falhada: os padrões diferenciam maiúsculas de minúsculas . Leia o java.text.SimpleDateFormatjavadoc sobre o que as partes individuais representam. Assim, por exemplo, Mdurante meses e mminutos. Além disso, existem anos de quatro dígitos yyyy, não cinco yyyyy. Veja mais de perto os trechos de código que eu postei aqui acima.


E se você quiser que a data pareça "Segunda-feira, 1 de setembro de 2012"?
precisa saber é o seguinte

11
@ CRM: Basta clicar no link javadoc, descobrir os caracteres padrão necessários e alterar o padrão de acordo.
precisa saber é o seguinte

Quando você ainda não está no Java 8, considere usar o backport, ThreeTen Backport e, em seguida, os primeiros exemplos da resposta. Ou para Android abaixo do nível 26 da API, ThreeTenABP .
Ole VV

157

A formatação é sensível a maiúsculas e minúsculas, portanto, use MM por mês e não por mm (isto é por minuto) e aaaa. Para referência, você pode usar as seguintes dicas.

G   Era designator  Text    AD
y   Year    Year    1996; 96
Y   Week year   Year    2009; 09
M   Month in year   Month   July; Jul; 07
w   Week in year    Number  27
W   Week in month   Number  2
D   Day in year Number  189
d   Day in month    Number  10
F   Day of week in month    Number  2
E   Day name in week    Text    Tuesday; Tue
u   Day number of week (1 = Monday, ..., 7 = Sunday)    Number  1
a   Am/pm marker    Text    PM
H   Hour in day (0-23)  Number  0
k   Hour in day (1-24)  Number  24
K   Hour in am/pm (0-11)    Number  0
h   Hour in am/pm (1-12)    Number  12
m   Minute in hour  Number  30
s   Second in minute    Number  55
S   Millisecond Number  978
z   Time zone   General time zone   Pacific Standard Time; PST; GMT-08:00
Z   Time zone   RFC 822 time zone   -0800
X   Time zone   ISO 8601 time zone  -08; -0800; -08:00

Exemplos:

"yyyy.MM.dd G 'at' HH:mm:ss z"  2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy"  Wed, Jul 4, '01
"h:mm a"    12:08 PM
"hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time
"K:mm a, z" 0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa"  02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z"    Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ" 010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"   2001-07-04T12:08:56.235-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX"   2001-07-04T12:08:56.235-07:00
"YYYY-'W'ww-u"  2001-W27-3

1
"aaaa-MM-dd'T'HH: mm: ss.SSSZ" deve ser "aaaa-MM-dd'T'HH: mm: ss.SSS'Z '"
um jogador justo em

2
não, se você colocar Z entre aspas simples, ele dará Z como saída, mas sem ele dará o Fuso Horário. por exemplo. 2014-08-14T01: 24: 57.236Z e sem ele 2014-08-14T01: 24: 57.236-0530 -> Eu tentei no jdk1.7
Dev

1
"aaaa.MMMMM.dd GGG hh: mm aaa" 02001.Julho 04 AD 12:08 Nota M adicional no mês. Quatro não cinco!
Stefano Mtangoo

se tiver 4 letras ou mais, o formulário completo será usado. assim você pode usar 4 vezes m ou mesmo 5 vezes sou seu mesmo
Dev

Isso é basicamente uma cópia e pasta dos documentos. Nenhuma explicação extra está sendo fornecida e não há link para os documentos em que mais informações podem ser adquiridas, se necessário. -1. ( Aqui está o link btw )
XenoRo 3/15/15

108

É claro que a resposta é criar um objeto SimpleDateFormat e usá-lo para analisar Strings para Data e para formatar Datas em Strings. Se você tentou o SimpleDateFormat e não funcionou, mostre seu código e quaisquer erros que você possa receber.

Adendo: "mm" no formato String não é o mesmo que "MM". Use MM por meses e mm por minutos. Além disso, aaaaa não é o mesmo que aaaa. por exemplo,:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class FormateDate {

    public static void main(String[] args) throws ParseException {
        String date_s = "2011-01-18 00:00:00.0";

        // *** note that it's "yyyy-MM-dd hh:mm:ss" not "yyyy-mm-dd hh:mm:ss"  
        SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Date date = dt.parse(date_s);

        // *** same for the format String below
        SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println(dt1.format(date));
    }

}

importar java.text.ParseException; importar java.text.SimpleDateFormat; importar java.util.Date; classe pública formatoteDate {/ ** * @param args * @throws ParseException * / public static void main (String [] args) lança ParseException {// TODO stub do método gerado automaticamente String String date_s = "2011-01-18 00:00 : 00,0 "; SimpleDateFormat dt = novo SimpleDateFormat ("aaaa-mm-dd hh: mm: ss"); Data data = dt.parse (date_s); SimpleDateFormat dt1 = new SimpleDateFormat ("aaaa-mm-dd"); System.out.println (dt1.format (data)); }} Eu quero colocar para fora deve ser "2011-01-18", mas colocar para fora é 02011-00-1
amit4444

Poste qualquer código que você tenha como complemento à pergunta original (quatro espaços recuados). Dessa forma, ele manterá sua formatação e poderemos lê-la.
Hovercraft cheio de enguias

1
Veja editar a minha resposta acima. Você está usando "mm" no formato String, onde deveria estar usando "MM"
Hovercraft Full Of Eels

hhlhe dará a hora no intervalo de 1 a 12, você precisará usar aalém de imprimir / analisar AMou PM. Para imprimir / analisar a hora no intervalo de 0 a 23, use HH.
11116 Andre Holzner

22

Por que não simplesmente usar isso

Date convertToDate(String receivedDate) throws ParseException{
        SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
        Date date = formatter.parse(receivedDate);
        return date;
    }

Além disso, esta é a outra maneira:

DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
String requiredDate = df.format(new Date()).toString();

ou

Date requiredDate = df.format(new Date());

Felicidades!


2
Por que não usar isso? Porque (a) ignora a questão do fuso horário. A determinação da data depende do fuso horário. Este código depende do fuso horário padrão da JVM. Portanto, os resultados podem variar inadvertidamente. E (b) porque as classes java.util.Date e SimpleDateFormat são notoriamente problemáticas e devem ser evitadas.
Basil Bourque

2
sempre retorne strin, Date requiredDate = df.format (new Date ());
delive

15

Usando o java.timepacote no Java 8 e posterior:

String date = "2011-01-18 00:00:00.0";
TemporalAccessor temporal = DateTimeFormatter
    .ofPattern("yyyy-MM-dd HH:mm:ss.S")
    .parse(date); // use parse(date, LocalDateTime::from) to get LocalDateTime
String output = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(temporal);

9

[editado para incluir as correções de BalusC] A classe SimpleDateFormat deve fazer o truque:

String pattern = "yyyy-MM-dd HH:mm:ss.S";
SimpleDateFormat format = new SimpleDateFormat(pattern);
try {
  Date date = format.parse("2011-01-18 00:00:00.0");
  System.out.println(date);
} catch (ParseException e) {
  e.printStackTrace();
}

DDsignifica "dia do ano", não "dia do mês". hhsignifica "hora em am / pm (1-12)", não "hora em dia (0-23)".
BalusC

9

Outras respostas estão corretas, basicamente você tinha o número errado de caracteres "y" em seu padrão.

Fuso horário

Porém, mais um problema ... Você não abordou os fusos horários. Se você pretendia UTC , deveria ter dito isso. Caso contrário, as respostas não estão completas. Se tudo o que você deseja é a parte da data sem a hora, não há problema. Mas se você continuar trabalhando que possa envolver tempo, deverá especificar um fuso horário.

Joda-Time

Aqui está o mesmo tipo de código, mas usando a biblioteca Joda-Time 2.3 de código aberto de terceiros

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.

String date_s = "2011-01-18 00:00:00.0";

org.joda.time.format.DateTimeFormatter formatter = org.joda.time.format.DateTimeFormat.forPattern( "yyyy-MM-dd' 'HH:mm:ss.SSS" );
// By the way, if your date-time string conformed strictly to ISO 8601 including a 'T' rather than a SPACE ' ', you could
// use a formatter built into Joda-Time rather than specify your own: ISODateTimeFormat.dateHourMinuteSecondFraction().
// Like this:
//org.joda.time.DateTime dateTimeInUTC = org.joda.time.format.ISODateTimeFormat.dateHourMinuteSecondFraction().withZoneUTC().parseDateTime( date_s );

// Assuming the date-time string was meant to be in UTC (no time zone offset).
org.joda.time.DateTime dateTimeInUTC = formatter.withZoneUTC().parseDateTime( date_s );
System.out.println( "dateTimeInUTC: " + dateTimeInUTC );
System.out.println( "dateTimeInUTC (date only): " + org.joda.time.format.ISODateTimeFormat.date().print( dateTimeInUTC ) );
System.out.println( "" ); // blank line.

// Assuming the date-time string was meant to be in Kolkata time zone (formerly known as Calcutta). Offset is +5:30 from UTC (note the half-hour).
org.joda.time.DateTimeZone kolkataTimeZone = org.joda.time.DateTimeZone.forID( "Asia/Kolkata" );
org.joda.time.DateTime dateTimeInKolkata = formatter.withZone( kolkataTimeZone ).parseDateTime( date_s );
System.out.println( "dateTimeInKolkata: " + dateTimeInKolkata );
System.out.println( "dateTimeInKolkata (date only): " + org.joda.time.format.ISODateTimeFormat.date().print( dateTimeInKolkata ) );
// This date-time in Kolkata is a different point in the time line of the Universe than the dateTimeInUTC instance created above. The date is even different.
System.out.println( "dateTimeInKolkata adjusted to UTC: " + dateTimeInKolkata.toDateTime( org.joda.time.DateTimeZone.UTC ) );

Quando correr ...

dateTimeInUTC: 2011-01-18T00:00:00.000Z
dateTimeInUTC (date only): 2011-01-18

dateTimeInKolkata: 2011-01-18T00:00:00.000+05:30
dateTimeInKolkata (date only): 2011-01-18
dateTimeInKolkata adjusted to UTC: 2011-01-17T18:30:00.000Z

9

Consulte "Padrões de data e hora" aqui. http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

import java.text.SimpleDateFormat;
import java.util.Date;
import java.text.ParseException;

public class DateConversionExample{

  public static void main(String arg[]){

    try{

    SimpleDateFormat sourceDateFormat = new SimpleDateFormat("yyyy-MM-DD HH:mm:ss");

    Date date = sourceDateFormat.parse("2011-01-18 00:00:00.0");


    SimpleDateFormat targetDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    System.out.println(targetDateFormat.format(date));

    }catch(ParseException e){
        e.printStackTrace();
    }
  } 

}

8
try
 {
    String date_s = "2011-01-18 00:00:00.0";
    SimpleDateFormat simpledateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
    Date tempDate=simpledateformat.parse(date_s);
    SimpleDateFormat outputDateFormat = new SimpleDateFormat("yyyy-MM-dd");           
    System.out.println("Output date is = "+outputDateFormat.format(tempDate));
  } catch (ParseException ex) 
  {
        System.out.println("Parse Exception");
  }

7
public class SystemDateTest {

    String stringDate;

    public static void main(String[] args) {
        SystemDateTest systemDateTest = new SystemDateTest();
        // format date into String
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
        systemDateTest.setStringDate(simpleDateFormat.format(systemDateTest.getDate()));
        System.out.println(systemDateTest.getStringDate());
    }

    public Date getDate() {
        return new Date();
    }

    public String getStringDate() {
        return stringDate;
    }

    public void setStringDate(String stringDate) {
        this.stringDate = stringDate;
    }
}

3
Adicione algumas informações às suas respostas para explicar seu código.
KK Gulseven

há uma getDate nome do método () pelo qual u pode obter data obj depois que se aplicam SimpleDateFormat de modo que você pode converter data acordo com o formato que é definido no construtor SimpleDateFormat e conjunto no método StringDate você pode fazê-lo em cache
Neeraj Gahlawat

6
   String str = "2000-12-12";
   Date dt = null;
   SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

    try 
    {
         dt = formatter.parse(str);
    }
    catch (Exception e)
    {
    }

    JOptionPane.showMessageDialog(null, formatter.format(dt));

6

Você pode apenas usar:

Date yourDate = new Date();

SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
String date = DATE_FORMAT.format(yourDate);

Funciona perfeitamente!


5

Você também pode usar substring ()

String date_s = "2011-01-18 00:00:00.0";
date_s.substring(0,10);

Se você quiser um espaço antes da data, use

String date_s = " 2011-01-18 00:00:00.0";
date_s.substring(1,11);

5

Você pode experimentar o Java 8 novo date, mais informações podem ser encontradas na documentação do Oracle .

Ou você pode tentar o antigo

public static Date getDateFromString(String format, String dateStr) {

    DateFormat formatter = new SimpleDateFormat(format);
    Date date = null;
    try {
        date = (Date) formatter.parse(dateStr);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    return date;
}

public static String getDate(Date date, String dateFormat) {
    DateFormat formatter = new SimpleDateFormat(dateFormat);
    return formatter.format(date);
}

4
private SimpleDateFormat dataFormat = new SimpleDateFormat("dd/MM/yyyy");

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    if(value instanceof Date) {
        value = dataFormat.format(value);
    }
    return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
};

3

remover um formulário y SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd");deve serSimpleDateFormat dt1 = new SimpleDateFormat("yyyy-mm-dd");


Não exatamente. Você também precisa do caso correto (não importa se você usa o moderno DateTimeFormatterou se apega aos desatualizados SimpleDateFormat).
Ole VV

0

SimpleDateFormat dt1 = new SimpleDateFormat ("aaaa-mm-dd");


Essa classe de data e hora foi substituída anos atrás pelas modernas classes java.time . Especificamente DateTimeFormattere DateTimeFormatterBuilder. Sugerir SimpleDateFormatem 2019 é um péssimo conselho.
Basil Bourque

Incorreto Seus códigos de formatação aqui estão incorretos. hhé por uma hora.
Basil Bourque

Normalmente, esperamos alguma discussão ou explicação. O estouro de pilha deve ser mais do que uma biblioteca de trechos.
Basil Bourque

0

Digamos que você queira alterar 2019-12-20 10:50 GMT + 6: 00 para 2019-12-20 10:50 Antes de tudo, você precisa entender o formato da data O primeiro formato de data é aaaa-MM-dd hh : mm a zzz e o segundo formato de data será aaaa-MM-dd hh: mm a

basta retornar uma string dessa função como.

public String convertToOnlyDate(String currentDate) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm a ");
    Date date;
    String dateString = "";
    try {
        date = dateFormat.parse(currentDate);
        System.out.println(date.toString()); 

        dateString = dateFormat.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return dateString;
}

Esta função retornará sua resposta de desejo. Se você quiser personalizar mais, adicione ou remova componentes do formato da data.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.