Изменить формат даты в строке Java


465

Я Stringпредставляю дату.

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

Я хотел бы преобразовать его в Date и вывести в YYYY-MM-DDформате.

2011-01-18

Как мне этого добиться?


Хорошо, основываясь на ответах, которые я получил ниже, вот что я попробовал:

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

Но это выводит 02011-00-1вместо желаемого 2011-01-18. Что я делаю неправильно?


163
ггггг не совпадает с гггг. :)
Судно на воздушной подушке, полное угрей

2
Вопрос бумеранга. Какой у вас вариант использования? Потому что возможно, что вы должны использовать встроенные шаблоны (DateFormat.getDateTimeInstance ()).
Павел Дида

11
Месяц представлен с MM в строке формата, а не с мм, как в примерах выше. мм означает минуты.
Майк

3
Я изменил yyyy-mm-dd на yyyy-MM-dd, потому что первоначальная версия не работала
Павло Зварыч

Ответы:


506

Используйте LocalDateTime#parse()(или, ZonedDateTime#parse()если строка содержит часть часового пояса), чтобы проанализировать Stringопределенный шаблон в LocalDateTime.

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

использование LocalDateTime#format() (или ZonedDateTime#format()) для формирования LocalDateTimeв Stringв определенном порядке.

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

Или , когда вы еще не работаете в Java 8, используйте SimpleDateFormat#parse()для анализа a Stringпо определенному шаблону в Date.

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

Используйте SimpleDateFormat#format()для форматирования карты Dateв Stringв определенном порядке.

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

Смотрите также:


Обновление : согласно вашей неудачной попытке: шаблоны чувствительны к регистру . Прочитайте java.text.SimpleDateFormatJavadoc, что означает отдельные части. Так стоит например Mмесяцами и mминутами. Кроме того, годы существуют из четырех цифр yyyy, а не пяти yyyyy. Посмотрите ближе на фрагменты кода, которые я разместил здесь выше.


Что если вы хотите, чтобы дата выглядела как «понедельник, 1 сентября 2012 года»?
crmepham

11
@crm: просто нажмите на ссылку javadoc, нарисуйте там необходимые символы шаблона и измените шаблон соответствующим образом.
BalusC

Когда вы еще не на Java 8, подумайте об использовании backport, ThreeTen Backport , а затем первых примеров из ответа. Или для Android ниже API уровня 26, ThreeTenABP .
Оле В.В.

157

Форматирование является CASE-SENSITIVE, поэтому используйте MM для месяца, а не мм (это для минуты) и yyyy. Для справки вы можете использовать следующую таблицу.

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

Примеры:

"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
«гггг-ММ-дд'Т'ХХ: мм: сс.СССЗ» должно быть «гггг-ММ-дд'Т'ХХ: мм: сс.ССС'З '»
честный игрок

2
нет, если вы поставите Z в одинарную кавычку, он выдаст Z в качестве вывода, но без него это даст часовой пояс. например. 2014-08-14T01: 24: 57.236Z и без него 2014-08-14T01: 24: 57.236-0530 -> Я пробовал на jdk1.7
Dev

1
"ггггг.МММММ.дд GGG чч: мм ааа" 02001.July.04 AD 12:08 PM Обратите внимание на дополнительные M в месяц. Четыре не пять!
Стефано Мтангу

если это 4 буквы или более, то используется полная форма. так что вы можете использовать 4 раза м или даже 5 раз м его же
Dev

Это в значительной степени Copy-Paste из документов. Никаких дополнительных объяснений не предоставляется, и нет ссылки на документы, где можно было бы получить больше информации, если это необходимо. -1. ( Вот ссылка между прочим )
XenoRo

108

Ответ, конечно же, состоит в том, чтобы создать объект SimpleDateFormat и использовать его для разбора строк на дату и для форматирования дат в строки. Если вы пробовали SimpleDateFormat и он не работал, то, пожалуйста, покажите свой код и любые ошибки, которые вы можете получить.

Приложение: "mm" в формате String не совпадает с "MM". Используйте ММ для месяцев и мм для минут. Кроме того, ггггг не совпадает с гггг. например,:

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

}

import java.text.ParseException; import java.text.SimpleDateFormat; импорт java.util.Date; public class formateDate {/ ** * @param args * @throws ParseException * / public static void main (String [] args) throws ParseException {// TODO Автоматически сгенерированная заглушка метода String date_s = "2011-01-18 00:00 : 00,0" ; SimpleDateFormat dt = new SimpleDateFormat ("ггггг-мм-дд чч: мм: сс"); Date date = dt.parse (date_s); SimpleDateFormat dt1 = new SimpleDateFormat ("ггггг-мм-дд"); System.out.println (dt1.format (date)); }} я хочу, чтобы «пут» был «2011-01-18», а «аут» 02011-00-1
amit4444

Разместите любой код, который у вас есть, в дополнение к исходному вопросу (с отступом в четыре пробела). Таким образом, он сохранит свое форматирование, и мы сможем его прочитать.
Судно на воздушной подушке, полное угрей

1
См. Редактировать мой ответ выше. Вы используете "мм" в вашем формате Строка, где вы должны использовать "ММ"
Hovercraft Full Of Eels

hhдаст вам час в диапазоне 1-12, вам нужно будет использовать aв дополнение к печати / разбора AMили PM. Чтобы напечатать / проанализировать час в диапазоне 0-23, используйте HH.
Андре Хольцнер

22

Почему бы просто не использовать это

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

Кроме того, это другой способ:

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

или

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

Ура!


2
Почему бы не использовать это? Потому что (а) он игнорирует вопрос о часовом поясе. Определение даты зависит от часового пояса. Этот код зависит от часового пояса JVM по умолчанию. Таким образом, результаты могут случайно измениться. И (б) потому что классы java.util.Date и SimpleDateFormat общеизвестно хлопотны и их следует избегать.
Василий Бурк

2
всегда возвращать strin, Date requiredDate = df.format (new Date ());
доставлено

15

Используя java.timeпакет в Java 8 и позже:

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

[отредактировано, чтобы включить исправления BalusC] Класс SimpleDateFormat должен сделать свое дело :

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

DDозначает «день в году», а не «день в месяце». hhозначает «час в час / час (1-12)», а не «час в день (0-23)».
BalusC

9

Другие ответы верны, в основном вы указали неверное количество символов «у» в вашем шаблоне.

Часовой пояс

Еще одна проблема ... Вы не обращались к часовым поясам. Если вы намеревались использовать UTC , значит, вы должны были это сказать. Если нет, ответы не являются полными. Если вам нужна только часть даты без времени, то нет проблем. Но если вы выполняете дальнейшую работу, которая может потребовать времени, вам следует указать часовой пояс.

Joda времени

Вот такой же код, но с использованием сторонней библиотеки с открытым исходным кодом Joda-Time 2.3

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

Когда беги…

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

Пожалуйста, обратитесь к «Шаблонам даты и времени» здесь. 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
Пожалуйста, добавьте некоторую информацию в ваш ответ (ы), чтобы объяснить ваш код.
Курсад Гюльсевен

есть имя метода getDate (), с помощью которого вы можете получить дату obj, после чего применить SimpleDateFormat, чтобы вы могли преобразовать дату в соответствии с вашим форматом, который определен в конструкторе SimpleDateFormat, и установить в методе StringDate, что вы можете сделать его кэшированным
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

Вы можете просто использовать:

Date yourDate = new Date();

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

Работает отлично!


5

Вы также можете использовать substring ()

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

Если вы хотите пробел перед датой, используйте

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

5

Вы можете попробовать Java 8 новой date, более подробную информацию можно найти в документации Oracle .

Или вы можете попробовать старый

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

удалить одну форму у SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd");должно бытьSimpleDateFormat dt1 = new SimpleDateFormat("yyyy-mm-dd");


Не совсем. Вам также нужен правильный регистр (независимо от того, используете ли вы модерн DateTimeFormatterили цепляетесь за устаревший SimpleDateFormat).
Оле В.В.

0

SimpleDateFormat dt1 = new SimpleDateFormat ("гггг-мм-дд");


Этот класс дата-время был вытеснен несколько лет назад современными классами java.time . Конкретно DateTimeFormatterа DateTimeFormatterBuilder. Предлагать SimpleDateFormatв 2019 году плохой совет.
Василий Бурк

Неверно Ваши коды форматирования здесь неверны. hhна час.
Василий Бурк

Обычно мы ожидаем некоторого обсуждения или объяснения. Переполнение стека должно быть больше, чем библиотека фрагментов.
Василий Бурк

0

Допустим, вы хотите изменить 2019-12-20 10:50 утра по Гринвичу + 6: 00 до 2019-12-20 10:50 утра. Прежде всего вам необходимо понять формат даты. Первый формат даты: гггг-мм-дд чч : mm a zzz и второй формат даты будет: гггг-мм-дд чч: мм а

просто вернуть строку из этой функции, как.

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

Эта функция вернет ваше желание ответить. Если вы хотите настроить больше, просто добавьте или удалите компонент из формата даты.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.