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

我有一个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。我做错了什么?

1588006 次浏览

答案当然是创建一个SimpleDateFormat对象,并使用它来解析“字符串到日期”并将“日期到字符串”格式化。如果您已经尝试了SimpleDateFormat,它没有工作,那么请显示您的代码和您可能收到的任何错误。

附录:String格式中的“mm”与“mm”不一样。用MM表示月,用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));
}


}

[编辑包括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();
}

使用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()以某种模式将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.SimpleDateFormat javadoc中的各个部分代表什么。例如,M表示月,m表示分钟。此外,年份存在四位yyyy,而不是五位yyyyy。仔细看看我上面发布的代码片段。

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

你也可以使用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);

其他答案是正确的,基本上你在你的图案中有错误数量的“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
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");
}

在Java 8及更高版本中使用java.time包:

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

为什么不简单地使用它呢

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

你可以用:

Date yourDate = new Date();


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

它工作得很完美!

格式是大小写敏感的,所以使用MM表示月,而不是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

你可以尝试Java 8 new date,更多信息可以在甲骨文的文档上找到。

或者你可以试试旧的

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

请参阅此处“日期及时间模式”。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();
}
}


}
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;
}
}
SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-mm-dd");

假设您想将2019-12-20上午10:50 GMT+6:00更改为2019-12-20上午10:50 首先,你们要理解日期格式首先,日期格式是 yyyy-MM-dd hh:mm a 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;
}

这个函数将返回您想要的答案。如果你想自定义更多,只需从日期格式中添加或删除组件。

我们可以将今天的日期转换为“2020年6月12日”的格式。

String.valueOf(DateFormat.getDateInstance().format(new Date())));
你有一些错误:

. SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd") < p >: 应该是 new SimpleDateFormat("yyyy-mm-dd"); //yyyy 4而不是5 这个显示02011,但是yyyy显示2011

第二:< p > 像这样更改代码 new SimpleDateFormat("yyyy-MM-dd"); < / p >

希望能帮到你

/**
* Method will take Date in "MMMM, dd yyyy HH:mm:s" format and return time difference like added: 3 min ago
*
* @param date : date in "MMMM, dd yyyy HH:mm:s" format
* @return : time difference
*/
private String getDurationTimeStamp(String date) {
String timeDifference = "";


//date formatter as per the coder need
SimpleDateFormat sdf = new SimpleDateFormat("MMMM, dd yyyy HH:mm:s");
TimeZone timeZone = TimeZone.getTimeZone("EST");
sdf.setTimeZone(timeZone);
Date startDate = null;
try {
startDate = sdf.parse(date);
} catch (ParseException e) {
MyLog.printStack(e);
}


//end date will be the current system time to calculate the lapse time difference
Date endDate = new Date();


//get the time difference in milliseconds
long duration = endDate.getTime() - startDate.getTime();


long diffInSeconds = TimeUnit.MILLISECONDS.toSeconds(duration);
long diffInMinutes = TimeUnit.MILLISECONDS.toMinutes(duration);
long diffInHours = TimeUnit.MILLISECONDS.toHours(duration);
long diffInDays = TimeUnit.MILLISECONDS.toDays(duration);


if (diffInDays >= 365) {
int year = (int) (diffInDays / 365);
timeDifference = year + mContext.getString(R.string.year_ago);
} else if (diffInDays >= 30) {
int month = (int) (diffInDays / 30);
timeDifference = month + mContext.getString(R.string.month_ago);
}
//if days are not enough to create year then get the days
else if (diffInDays >= 1) {
timeDifference = diffInDays + mContext.getString(R.string.day_ago);
}
//if days value<1 then get the hours
else if (diffInHours >= 1) {
timeDifference = diffInHours + mContext.getString(R.string.hour_ago);
}
//if hours value<1 then get the minutes
else if (diffInMinutes >= 1) {
timeDifference = diffInMinutes + mContext.getString(R.string.min_ago);
}
//if minutes value<1 then get the seconds
else if (diffInSeconds >= 1) {
timeDifference = diffInSeconds + mContext.getString(R.string.sec_ago);
} else if (timeDifference.isEmpty()) {
timeDifference = mContext.getString(R.string.now);
}


return mContext.getString(R.string.added) + " " + timeDifference;
}

java.time

java.util Date-Time API和它们的格式化API SimpleDateFormat已经过时并且容易出错。建议完全停止使用它们,并切换到现代日期时间API

同样,下面引用的是Joda-Time的通知:

注意,从Java SE 8开始,用户被要求迁移到Java。time (JSR-310)——JDK的核心部分,取代了这个项目。

使用java.time(现代Date-Time API)的解决方案:

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;


public class Main {
public static void main(String[] args) {
String strDate = "2011-01-18 00:00:00.0";
DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("u-M-d H:m:s.S", Locale.ENGLISH);
LocalDateTime ldt = LocalDateTime.parse(strDate, dtfInput);
// Alternatively, the old way:
// LocalDateTime ldt = dtfInput.parse(strDate, LocalDateTime::from);


LocalDate date = ldt.toLocalDate();
System.out.println(date);
}
}

输出:

2011-01-18

ONLINE DEMO

关于解决方案的一些重要注意事项:

  1. java.time使得在日期时间类型本身上调用parseformat函数成为可能,除了旧的方法(即在格式化器类型上调用parseformat函数,在java.time API的情况下是DateTimeFormatter)。
  2. 现代Date-Time API基于ISO 8601,只要Date-Time字符串符合ISO 8601标准,就不需要显式使用DateTimeFormatter对象。例如,我没有使用DateTimeFormatter作为输出,因为LocalDate#toString已经以所需的格式返回字符串。
  3. 在这里,你可以使用y而不是u,而是我更喜欢__ABC1而不是y

Trail: Date Time了解有关现代Date-Time API的更多信息。


*无论出于何种原因,如果你必须坚持使用Java 6或Java 7,你可以使用< em > < >强ThreeTen-Backport < /强> < / em >,它将大部分java.time功能向后移植到Java 6 &7. 如果你正在为一个Android项目工作,而你的Android API级别仍然不符合Java-8,检查通过糖化可获得Java 8+ api如何在Android项目中使用ThreeTenABP。 < /一口> < / p >