Java中的日历日期为yyyy-MM-dd格式


210

如何将日历日期转换为yyyy-MM-dd格式。

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 1);
Date date = cal.getTime();             
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
String date1 = format1.format(date);            
Date inActiveDate = null;
try {
    inActiveDate = format1.parse(date1);
} catch (ParseException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

这将产生inActiveDate = Wed Sep 26 00:00:00 IST 2012。但是我需要的是2012-09-26。我的目的是使用Hibernate条件将此日期与数据库中的另一个日期进行比较。所以我需要yyyy-MM-dd格式的日期对象。


5
您的代码令人困惑。你们是不是要格式化Dateyyyy-MM-dd或解析字符串yyyy-MM-ddDate值?要设置日期格式,只需使用format1.format(date),即可解析日期,请使用format1.parse(someStringValueInTheCorrectFormat)
MadProgrammer 2012年

我已经编辑我的问题..对不起,我上次犯的错..
Sarika.S

9
一艘班轮:( new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" ) ).format( Calendar.getInstance().getTime() );
伊万·奥坎普

Answers:


342

Java Date是自1970年1月1日格林尼治标准时间00:00:00以来的毫秒数的容器。

当您使用时System.out.println(date),Java将使用Date.toString()打印内容。

更改它的唯一方法是重写Date并提供您自己的实现Date.toString()。现在,在启动IDE并尝试执行此操作之前,我不会这样做;它只会使事情复杂化。最好将日期格式化为要使用(或显示)的格式。

Java 8+

LocalDateTime ldt = LocalDateTime.now().plusDays(1);
DateTimeFormatter formmat1 = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.ENGLISH);
System.out.println(ldt);
// Output "2018-05-12T17:21:53.658"

String formatter = formmat1.format(ldt);
System.out.println(formatter);
// 2018-05-12

Java 8之前的版本

您应该利用ThreeTen Backport

以下内容出于历史目的保留(作为原始答案)

您可以做的是格式化日期。

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 1);
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(cal.getTime());
// Output "Wed Sep 26 14:23:28 EST 2012"

String formatted = format1.format(cal.getTime());
System.out.println(formatted);
// Output "2012-09-26"

System.out.println(format1.parse(formatted));
// Output "Wed Sep 26 00:00:00 EST 2012"

这些实际上是同一日期,表示方式有所不同。


1
有点,但使用它更容易Calendar
MadProgrammer

1
无论如何要从此日历对象中完全删除时区?
Sarika.S 2012年

2
如果您真的对日期/时间操作很认真,请看一下Joda Time,然后轻松Calendar
搞定

2
@ n13如果问题是关于数据库日期操纵甚至是时间操纵,我可能会同意你的看法。问题是如何用特定的日期格式表示日期值
MadProgrammer

1
结构合理的答案-这基本上是Model(Date)-View(Format)分离。
YoYo'2

19

您的代码是错误的。没有时间解析日期,并将其保留为Date对象。

要显示日历日期对象时,可以设置其格式并将其保留为字符串。

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 1);
Date date = cal.getTime();             
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");          
String inActiveDate = null;
try {
    inActiveDate = format1.format(date);
    System.out.println(inActiveDate );
} catch (ParseException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

13

java.time

MadProgrammer答案是正确的,尤其是有关Joda-Time的提示。现在,Joda-Time的后继者已作为新的java.time包内置在Java 8中。这是Java 8中的示例代码。

当使用日期时间(而不是本地日期)时,时区处于临界状态。每月的日期取决于时区。例如,印度标准时间+05:30(UTC提前五个半小时),而法国是只领先一小时。因此,在印度,新一天中的某个时刻具有一个日期,而在法国中同一天具有一个“昨天”的日期。创建缺少任何时区或偏移量信息的字符串输出会造成歧义。您要求提供YYYY-MM-DD输出,所以我提供了此输出,但我不建议这样做。而不是ISO_LOCAL_DATE我会习惯于ISO_DATE获得以下输出:2014-02-25+05:30

ZoneId zoneId = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zonedDateTime = ZonedDateTime.now( zoneId );

DateTimeFormatter formatterOutput = DateTimeFormatter.ISO_LOCAL_DATE; // Caution: The "LOCAL" part means we are losing time zone information, creating ambiguity.
String output = formatterOutput.format( zonedDateTime );

转储到控制台...

System.out.println( "zonedDateTime: " + zonedDateTime );
System.out.println( "output: " + output );

运行时...

zonedDateTime: 2014-02-25T14:22:20.919+05:30[Asia/Kolkata]
output: 2014-02-25

乔达时代

使用Joda-Time库(java.time的前身)的类似代码。

DateTimeZone zone = new DateTimeZone( "Asia/Kolkata" );
DateTime dateTime = DateTime.now( zone );
DateTimeFormatter formatter = ISODateTimeFormat.date();
String output = formatter.print( dateTime );

ISO 8601

顺便说一下,输入字符串的格式是一种标准格式,是ISO 8601定义的几种方便的日期时间字符串格式之一。

在解析和生成各种日期时间值的字符串表示形式时,默认情况下,Joda-Time和java.time都使用ISO 8601格式。


6

java.util.Date对象不能以自定义格式表示日期,而是必须使用return的方法。SimpleDateFormat.formatstring

String myString=format1.format(date);

2

为了解析java.util.Date对象,您必须先使用自己的格式将其转换为String。

inActiveDate = format1.parse(  format1.format(date)  );

但我相信您在这里很多余。


2
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 7);
Date date = c.getTime();
SimpleDateFormat ft = new SimpleDateFormat("MM-dd-YYYY");
JOptionPane.showMessageDialog(null, ft.format(date));

这将在JOption窗口窗格中以月,日和年的格式显示日期+ 7天。


2
public static void main(String[] args) {
    Calendar cal = Calendar.getInstance();
    cal.set(year, month, date);
    SimpleDateFormat format1 = new SimpleDateFormat("yyyy MM dd");
    String formatted = format1.format(cal.getTime());
    System.out.println(formatted);
}

2
欢迎来到SO。请添加一些上下文/解释,因为仅代码的答案不符合我们的标准。请参阅stackoverflow.com/help/how-to-answer
Uwe Allner '17

0

我发现这段代码以与数据库中的日期字段进行比较的格式比较了日期...可能对您有帮助...

当您使用simpledateformat将字符串转换为日期时,很难与mysql数据库中的Date字段进行比较。

因此,使用select STR_to_DATE('yourdate','%m /%d /%Y')->这种格式的格式转换Java字符串日期,然后您将获得mysql date字段的确切日期格式。

http://javainfinite.com/java/java-convert-string-to-date-and-compare/


3
由于链接腐烂和其他问题,在StackOverflow上不建议仅链接的答案。您能否概述要点的信息?
罗勒·布尔克

0
public static String ThisWeekStartDate(WebDriver driver) {
        Calendar c = Calendar.getInstance();
        //ensure the method works within current month
        c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        System.out.println("Before Start Date " + c.getTime());
        Date date = c.getTime();

          SimpleDateFormat dfDate = new SimpleDateFormat("dd MMM yyyy hh.mm a");

          String CurrentDate = dfDate.format(date);
          System.out.println("Start Date " + CurrentDate);
          return CurrentDate;

    }
    public static String ThisWeekEndDate(WebDriver driver) {

        Calendar c = Calendar.getInstance();
        //ensure the method works within current month
        c.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
        System.out.println("Before End Date " + c.getTime());
        Date date = c.getTime();

          SimpleDateFormat dfDate = new SimpleDateFormat("dd MMM yyyy hh.mm a");

          String CurrentDate = dfDate.format(date);
          System.out.println("End Date " + CurrentDate);
          return CurrentDate;
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.