我有一个代表日期的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。我在做什么错?

评论

yyyyy与yyyy不同。 :)

回旋镖问题。您的用例是什么?因为您可能应该使用内置模式(DateFormat.getDateTimeInstance())。

在格式字符串中用MM表示月份,而不像上面的示例那样用mm表示月份。毫米表示分钟。

我将yyyy-mm-dd更改为yyyy-MM-dd,因为初始版本无效

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


使用DateSimpleDateFormat#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.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 楼

其他答案是正确的,基本上您的模式中的“ 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