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
。我在做什么错?#1 楼
使用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 newstring = datetime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
System.out.println(newstring); // 2011-01-18
或者,如果您还没有使用Java 8,请使用
String
来解析SimpleDateFormat#parse()
特定模式转换为String
。String oldstring = "2011-01-18 00:00:00.0";
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").parse(oldstring);
使用
Date
将SimpleDateFormat#format()
格式化为特定模式。 另请参见:
Java字符串到日期的转换
更新:根据您的失败尝试:模式区分大小写。阅读
Date
javadoc各个部分代表什么。因此,例如,String
代表几个月,java.text.SimpleDateFormat
代表分钟。此外,年份存在四个数字M
,而不是五个m
。仔细看看我在上面发布的代码片段。评论
如果您希望日期看起来像“ 2012年9月1日星期一”,该怎么办?
– crmepham
2014年6月5日上午10:20
@crm:只需单击javadoc链接,在那里找到必要的模式字符并相应地更改模式。
– BalusC
2014-6-5 11:19
当您尚未使用Java 8时,请考虑使用backport,ThreeTen Backport,然后使用答案中的第一个示例。或对于API级别26以下的Android,ThreeTenABP。
– Ole V.V.
19-10-10在5:07
#2 楼
格式区分大小写,因此请使用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'T'HH:mm:ss.SSSZ”应为“ yyyy-MM-dd'T'HH:mm:ss.SSS'Z'”
–公平竞争者
2014年8月6日15:54
不,如果您将Z放在单引号中,它将给出Z作为输出,但是如果没有它,它将给出Timezone。例如。 2014-08-14T01:24:57.236Z和没有它2014-08-14T01:24:57.236-0530->我尝试了jdk1.7
–开发
2014年8月14日6:26
“ yyyyy.MMMMM.dd GGG hh:mm aaa” 02001.July.04 AD 12:08 PM注意月份中的额外M。四不五!
– Stefano Mtangoo
2014年12月12日上午8:53
如果它是4个字母或更多,则使用完整格式。所以你可以用4倍甚至5倍
–开发
2014年12月12日上午9:03
这几乎是文档的复制粘贴。没有提供额外的解释,并且没有指向文档的链接,如果需要的话,可以获取更多信息。 -1。 (这里是链接顺便说一句)
– XenoRo
2015年12月3日,12:19
#3 楼
答案当然是创建一个SimpleDateFormat对象,并使用它来将String解析为Date并将Dates格式化为String。如果您尝试过SimpleDateFormat,但该方法不起作用,请显示您的代码和可能出现的任何错误。附录:“ 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));
}
}
评论
导入java.text.ParseException;导入java.text.SimpleDateFormat;导入java.util.Date;公共类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(“ yyyyy-mm-dd hh:mm:ss”);日期date = dt.parse(date_s); SimpleDateFormat dt1 =新的SimpleDateFormat(“ yyyyy-mm-dd”); System.out.println(dt1.format(date)); }}我希望输出为“ 2011-01-18”,但输出为02011-00-1
– amit4444
2011年1月23日在5:14
发表您对原始问题的补充代码(缩进四个空格)。这样,它将保留其格式,然后我们可以读取它。
–气垫船充满鳗鱼
2011年1月23日下午5:15
请参阅上面的“编辑我的答案”。您以字符串格式使用“ mm”,而应使用“ MM”
–气垫船充满鳗鱼
2011年1月23日下午5:19
hh将为您提供1到12范围内的小时,除了打印/解析AM或PM外,您还需要使用。要打印/解析0-23范围内的小时,请使用HH。
–安德烈·霍尔兹纳(Andre Holzner)
16-4-7在11:36
#4 楼
为什么不简单使用此方法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());
评论
为什么不使用这个?因为(a)它忽略了时区问题。确定日期取决于时区。此代码取决于JVM的默认时区。因此,结果可能会无意间发生变化。 (b)因为众所周知java.util.Date和SimpleDateFormat类很麻烦,应避免使用。
–罗勒·布尔克
2014年6月26日6:37
总是返回strin,Date requiredDate = df.format(new Date());
–user3402040
18年1月30日在12:17
#5 楼
在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);
#6 楼
[已编辑,包括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
2011年1月23日在5:27
#7 楼
请在此处参考“日期和时间模式”。 http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.htmlimport 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 楼
其他答案是正确的,基本上您的模式中的“ y”字符数错误。时区
另一个问题……您未解决时区。如果您打算使用UTC,那么您应该这么说。如果不是,则答案不完整。如果您想要的只是没有时间的日期部分,那么就没有问题。但是,如果您做进一步的工作可能涉及时间,那么应该指定一个时区。
Joda-Time
这里是相同类型的代码,但使用第三个代码-party开源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 楼
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");
}
#10 楼
您可以使用:Date yourDate = new Date();
SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
String date = DATE_FORMAT.format(yourDate);
它完美地工作!
评论
此代码返回错误“未捕获的SyntaxError:意外的标识符”
–伊凡·弗洛洛夫(Ivan Frolov)
12月4日14:58
@IvanFrolov可能是您缺少导入,您在哪一行出现错误?
–cнŝdk
12月6日13:23
哦,很抱歉-没注意到它是Java的解决方案,我已经搜索了javascript解决方案)))(btw-已经找到)。谢谢!
–伊凡·弗洛洛夫(Ivan Frolov)
12月8日9:31
好的,现在很明显。
–cнŝdk
12月8日10:30
#11 楼
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;
}
}
评论
请在您的答案中添加一些信息以解释您的代码。
–库尔萨德·古尔森(Kursad Gulseven)
17年2月16日在6:09
有一个方法名称getDate(),在应用SimpleDateFormat之后,您可以通过该方法名称获取日期obj,以便您可以根据在SimpleDateFormat构造函数中定义并在StringDate方法中设置的格式转换日期
– Neeraj Gahlawat
17年2月23日在9:47
#12 楼
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));
#13 楼
您还可以使用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);
#14 楼
您可以尝试使用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);
}
#15 楼
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);
};
#16 楼
请从以下格式中删除一个:提供给以下格式的格式:SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd");
应为:
SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-mm-dd");
评论
不完全是。您还需要正确的大小写(无论您使用现代的DateTimeFormatter还是紧贴过时的SimpleDateFormat)。
– Ole V.V.
18年8月27日在12:35
#17 楼
假设您要将格林威治标准时间2019-12-20 10:50 AM更改为2019-12-20 10:50 AM首先您必须了解日期格式第一个日期格式是
yyyy-MM-dd hh:mm是zzz,第二个日期格式将是yyyy-MM-dd hh:mm是
只需从此函数返回一个字符串即可。
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;
}
此功能将返回您想要的答案。如果要自定义更多内容,只需在日期格式中添加或删除组件。
#18 楼
我们可以将今天的日期转换为“ 2020年6月12日”的格式。String.valueOf(DateFormat.getDateInstance().format(new Date())));
#19 楼
SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-mm-dd");
评论
这个日期时间类在几年前被现代的java.time类所取代。特别是DateTimeFormatter和DateTimeFormatterBuilder。在2019年建议SimpleDateFormat是一个糟糕的建议。
–罗勒·布尔克
19年7月3日在17:03
错误的格式代码在这里是错误的。 hh是一个小时。
–罗勒·布尔克
19年7月3日在17:05
通常,我们希望进行一些讨论或解释。堆栈溢出不只是片段库。
–罗勒·布尔克
19年7月3日在17:06
评论
yyyyy与yyyy不同。 :)回旋镖问题。您的用例是什么?因为您可能应该使用内置模式(DateFormat.getDateTimeInstance())。
在格式字符串中用MM表示月份,而不像上面的示例那样用mm表示月份。毫米表示分钟。
我将yyyy-mm-dd更改为yyyy-MM-dd,因为初始版本无效