Змініть формат дати в рядку Java


465

Я Stringпредставляю побачення.

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

Я хотів би перетворити його в a 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
yyyyy - це не те, що yyyy. :)
Hovercraft Full Of Eels

2
Питання бумерангу. Який ваш випадок використання? Оскільки можливо, ви повинні використовувати вбудовані шаблони (DateFormat.getDateTimeInstance ()).
Paweł Dyda

11
Місяць представлений з ММ у рядку формату, а не у мм, як у наведених вище прикладах. мм означає хвилини.
Майк

3
Я змінив yyyy-mm-dd на yyyy-MM-dd, тому що початкова версія не працювала
Павло Зварич

Відповіді:


506

Використовуйте LocalDateTime#parse()(або ZonedDateTime#parse()якщо рядок містить частину часового поясу) для розбору Stringпевного шаблону на 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"));

Використовуйте 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()для розбору 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, ThreeTenABP .
Оле ВВ

157

Форматування є СЛУЧАЛЬНИМ ВИКОРИСТАННЯМ, тому ВИКОРИСТОВУЙТЕ ММ на місяць не мм (це за хвилину), а рр-р. Для довідки ви можете використовувати наступний чіт-лист.

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
"yyyy-MM-dd'T'HH: mm: ss.SSSZ" повинно бути "yyyy-MM-dd'T'HH: mm: ss.SSS'Z '"
справедливий гравець

2
ні, якщо ви покладете Z в одну цитату, вона дасть Z як вихід, але без неї це дасть Timezone. напр. 2014-08-14T01: 24: 57.236Z і від нього без 2014-08-14T01: 24: 57.236-0530 -> Я спробував на jdk1.7
Dev

1
"yyyyy.MMMMM.dd GGG hh: mm aaa" 02001.Ju.04.04 AD 12:08 PM Зверніть увагу на додатковий M місяць. Чотири не п'ять!
Стефано Мтангу

якщо це 4 літери або більше, то використовується повна форма. тож ви можете використовувати 4 рази m або навіть 5 разів m його ж
Dev

Це в значній мірі копія-вставка документів. Ніяких додаткових пояснень не надається, і немає посилання на документи, де можна отримати додаткову інформацію за потреби. -1. ( Ось посилання btw )
XenoRo

108

Відповідь, звичайно, створити об’єкт SimpleDateFormat та використовувати його для розбору рядків до дати та форматування дат до рядків. Якщо ви спробували SimpleDateFormat, і він не спрацював, то будь ласка, покажіть свій код та будь-які помилки, які ви можете отримати.

Додаток: "мм" у форматі String не є "MM". Використовуйте ММ місяці, а мм - хвилин. Також yyyyy - це не те саме, що yyyy. наприклад:

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

}

імпорт java.text.ParseException; імпорт java.text.SimpleDateFormat; імпорт java.util.Date; public class formateDate {/ ** * @param args * @throws ParseException * / public static void main (String [] args) кидає ParseException {// TODO Автоматично створений метод stub String date_s = "2011-01-18 00:00 : 00,0 "; SimpleDateFormat dt = новий SimpleDateFormat ("гггг-мм-дд гг: мм: сс"); Дата дата = dt.parse (date_s); SimpleDateFormat dt1 = новий SimpleDateFormat ("yyyyy-mm-dd"); System.out.println (dt1.format (дата)); }} Я хочу, щоб покласти має бути "18.01.2011", але вихід поставлений 02011-00-1
amit4444

Опублікуйте будь-який код, який ви є доповненням до початкового питання (з відступом чотирьох пробілів). Таким чином він збереже своє форматування, і ми зможемо його прочитати.
Hovercraft Full Of Eels

1
Дивіться редагування моєї відповіді вище. Ви використовуєте "мм" у своєму форматі Рядок, де ви повинні використовувати "MM"
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 за замовчуванням. Отже, результати можуть неоднаково змінюватися. І (b) тому, що класи java.util.Date та SimpleDateFormat, як відомо, непросто, і їх слід уникати.
Василь Бурк

2
завжди повертайте strin, Date mustDate = df.format (нова дата ());
доставлять

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

Інші відповіді правильні, в основному у вашому шаблоні було неправильне число символів "y".

Часовий пояс

Ще одна проблема ... Однак ви не зверталися до часових поясів. Якщо ви задумали UTC , то ви повинні були так сказати. Якщо ні, відповіді не повні. Якщо все, що вам потрібно, це частина дати без часу, то жодних проблем. Але якщо ви робите подальшу роботу, яка може залучати час, то вам слід вказати часовий пояс.

Joda-Time

Ось такий же код, але з використанням сторонньої бібліотеки з відкритим кодом 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

Ви також можете використовувати підрядку ()

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

видалити одну форму y SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd");слідSimpleDateFormat dt1 = new SimpleDateFormat("yyyy-mm-dd");


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

0

SimpleDateFormat dt1 = новий SimpleDateFormat ("yyyy-mm-dd");


Цей клас дату часу був витіснений роками тому сучасними класами java.time . Конкретно DateTimeFormatterі DateTimeFormatterBuilder. Пропонувати SimpleDateFormat2019 рік - це погана порада.
Василь Бурк

Неправильно Ваші коди форматування тут неправильні. hhце за годину.
Василь Бурк

Зазвичай ми очікуємо певного обговорення чи пояснення. Переповнення стека повинно бути більше, ніж бібліотека фрагментів.
Василь Бурк

0

Скажімо, ви хочете змінити 2019-12-20 10:50 GMT + 6:00 до 2019-12-20 10:50, перш за все, ви повинні зрозуміти формат дати спочатку один формат дати - yyyy-MM-dd hh : мм zzz, а другий формат дати буде yyyy-MM-dd hh: mm a

просто поверніть рядок з цієї функції, як.

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.