更改Java字符串中的日期格式

Change date format in a Java string

我有一个String代表一个日期。

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

我想把它转换成一个Date格式,并以YYYY-MM-DD格式输出。

2011-01-18

我怎样才能做到这一点?

好吧,根据我在下面找到的答案,我尝试了以下方法:

1
2
3
4
5
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。我做错什么了?


如果字符串正好包含时区部分,则使用LocalDateTime#parse()ZonedDateTime#parse()将特定模式的String解析为LocalDateTime

1
2
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

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

或者,当您还没有在Java 8上时,使用EDCOX1(8)来将EDCOX1的2个解析以某种模式解析为EDCOX1(10)。

1
2
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

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

。另请参见:

  • Java串到日期转换

更新:根据失败的尝试:模式区分大小写。阅读java.text.SimpleDateFormatjavadoc中各个部分的含义。例如,M代表几个月,M代表分钟。另外,年份是四位数的yyyy,而不是五位数的yyyyy。仔细看看我在上面发布的代码片段。


格式是区分大小写的,因此使用mm表示月份而不是mm(这表示分钟)和yyyy作为参考,你可以使用下面的作弊表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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

示例:

1
2
3
4
5
6
7
8
9
10
11
"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


答案当然是创建一个simpledateformat对象,并使用它来分析字符串到日期,并将日期格式化为字符串。如果您尝试过simpledateformat,但它不起作用,请显示您的代码和可能收到的任何错误。

附录:格式字符串中的"mm"与"mm"不同。月用mm,分钟用mm。此外,YYYYY与YYYY不同。例如。,:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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));
    }

}


为什么不直接用这个呢

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

另外,这是另一种方式:

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

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

干杯!


在Java 8和以后使用EDCOX1×21的包:

1
2
3
4
5
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);


其他答案是正确的,基本上你的模式中的"Y"字符数是错误的。

时区

不过还有一个问题……你没有解决时区问题。如果你想要UTC,那么你应该这么说。如果没有,答案就不完整。如果你想要的只是没有时间的日期部分,那么就没有问题了。但是,如果您做的进一步工作可能涉及到时间,那么您应该指定一个时区。

乔达时间

这里有相同类型的代码,但是使用第三方开放源码joda time 2.3库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// ? 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 ) );

运行时…

1
2
3
4
5
6
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


请参阅此处的"日期和时间模式"。http://docs.oracle.com/javase/7/docs/api/java/text/simpledateformat.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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();
    }
  }

}


[编辑以包括Balusc的更正]simpledateformat类应该做到这一点:

1
2
3
4
5
6
7
8
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();
}


1
2
3
4
5
6
7
8
9
10
11
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");
  }


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class SystemDateTest {

    String stringDate;

    public static void main(String[] args) {
        SystemDateTest systemDateTest = new SystemDateTest();
        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;
    }
}


1
2
3
4
5
6
7
8
9
10
11
12
13
   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));


您只需使用:

1
2
3
4
Date yourDate = new Date();

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

它工作得很好!


也可以使用substring()。

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

如果您想在日期前留一个空格,请使用

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

1
2
3
4
5
6
7
8
9
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);
};

取下一个Y形SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd");应为SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-mm-dd");


您可以尝试Java 8新的EDCOX1(10),可以在Oracle文档中找到更多的信息。

或者你可以试试旧的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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);
    }