2010-05-10 188 views
13

我需要一个Java程序来获得当前日期而没有给时间Java程序来获得当前的日期没有时间戳

Date d = new Date(); 

给我的日期和时间戳。

但我只需要日期,没有时间戳。我使用这个日期来比较没有时间戳的另一个日期对象。

上打印

System.out.println("Current Date : " + d) 
的d

它应该打印May 11 2010 - 00:00:00

+1

是否要比较两个日期以查看它们是否在同一天(忽略时间),还是要输出没有时间部分的日期?我得到了你想要的第一印象,但答案似乎认为你想要第二个 – 2010-05-10 20:53:40

+0

那么,首先他谈到比较,然后他给出了打印它作为一个例子,以表明他没有时间戳意味着什么,所以我猜测他真的想比较时间而不是打印它,但如果这是他想要的,他可能不应该提及打印出来,因为这会混淆问题。 – 2010-05-10 21:02:06

回答

36

一个java.util.Date对象一种时间戳的 - 它包含了自1970年1月1日00:00:00 UTC毫秒数。所以你不能使用标准的Date对象只包含一天/一年/一年,而没有时间。

据我所知,没有真正简单的方法来比较日期,只需在标准Java API中考虑日期(而不是时间)即可。您可以使用Calendar类疏通小时,分钟,秒和毫秒:

Calendar cal = Calendar.getInstance(); 
cal.clear(Calendar.HOUR_OF_DAY); 
cal.clear(Calendar.AM_PM); 
cal.clear(Calendar.MINUTE); 
cal.clear(Calendar.SECOND); 
cal.clear(Calendar.MILLISECOND); 

不要使用包含要比较它的日期另一个Calendar对象相同,并使用after()before()方法做比较。

如所解释成java.util.Calendar.clear(INT字段)的的Javadoc:

HOUR_OF_DAYHOURAM_PM字段独立处理和分辨率适用于一天中的时间规则。清除其中一个字段不会重置此日历的小时数值。使用set(Calendar.HOUR_OF_DAY,0)重置小时值。

编辑 - 上面的答案是从2010年开始的;在Java 8中,包java.time中有一个新的日期和时间API,它比旧的java.util.Datejava.util.Calendar类更加强大和有用。使用新的日期和时间类,而不是旧的。

+1

我不知道cal.clear(),我会偷它并更新我的答案。 – staticman 2010-05-10 21:08:11

+0

你可以,如果你给我+1 ;-) – Jesper 2010-05-10 21:08:57

+0

没问题,已经完成。 – staticman 2010-05-11 17:29:52

4

你可以使用

// Format a string containing a date. 
import java.util.Calendar; 
import java.util.GregorianCalendar; 
import static java.util.Calendar.*; 

Calendar c = GregorianCalendar.getInstance(); 
String s = String.format("Duke's Birthday: %1$tm %1$te,%1$tY", c); 
// -> s == "Duke's Birthday: May 23, 1995" 

看一看的Formatter API documentation

+0

我不会像你提到的那样通过任何日期。 – minil 2010-05-10 20:51:55

+0

更新了要通过返回当前日期的GregorianCalendar.getInstance()的代码。 – aioobe 2010-05-10 20:55:06

+1

为什么明确使用'GregorianCalendar' - 为什么不直接使用'Calendar.getInstance()'? – Jesper 2010-05-10 21:01:18

3
DateFormat dateFormat = new SimpleDateFormat("MMMM dd yyyy"); 
    java.util.Date date = new java.util.Date(); 
    System.out.println("Current Date : " + dateFormat.format(date)); 
11

您可以随时使用apache commons'DateUtils类。它具有静态方法isSameDay(),它“检查两个日期对象是否在同一天忽略时间。”

static boolean isSameDay(Date date1, Date date2) 
+0

我读了isSameDay的文档,我不明白它的工作原理。它如何确定一天而不使用时区?有时两个Date实例可以在同一天或不同日期(午夜之前和之后),具体取决于假定的时区。它是否假定系统的默认时区? – 2010-05-10 21:59:03

+1

我不知道它究竟做了什么。你一定要看看源代码。但是,如果您查看Date API,则它会根据当地时区执行所有操作。实际上,与转换到其他时区有关的所有方法都已弃用。所以,Date看起来好像并不真正处理时区。如果您想对时区进行任何操作,请查看日历。 – 2010-05-10 22:23:28

+0

自1970年1月1日00:00:00 GMT以来,内部的日期为毫秒。我希望每天的计算也在GMT。 – ToolmakerSteve 2015-09-06 20:22:33

0

我认为这会奏效。使用日历处理时间字段(将它们重置为零),然后从日历中获取日期。

Calendar c = GregorianCalendar.getInstance(); 
c.clear(Calendar.HOUR_OF_DAY); 
c.clear(Calendar.MINUTE); 
c.clear(Calendar.SECOND); 
c.clear(Calendar.MILLISECOND); 
Date today = c.getTime(); 

或者做相反的事。把你要比较的日期在日历和比较日历日期

Date compareToDate; // assume this is set before going in. 
Calendar today = GregorianCalendar.getInstance(); 
Calendar compareTo = GregorianCalendar.getInstance(); 
compareTo.setTime(compareToDate); 
if(today.get(Calendar.YEAR) == compareTo.get(Calendar.YEAR) && 
    today.get(Calendar.DAY_OF_YEAR ) == compareTo.get(Calendar.DAY_OF_YEAR )) { 
    // They are the same day! 
} 
0

下面是快速做它无需额外的依赖关系的不雅方式。
您可以使用扩展java.util.Date的java.sql.Date,尽管为了比较您必须比较字符串。

java.sql.Date dt1 = new java.sql.Date(System.currentTimeMillis()); 
String dt1Text = dt1.toString(); 
System.out.println("Current Date1 : " + dt1Text); 

Thread.sleep(2000); 

java.sql.Date dt2 = new java.sql.Date(System.currentTimeMillis()); 
String dt2Text = dt2.toString(); 
System.out.println("Current Date2 : " + dt2Text); 

boolean dateResult = dt1.equals(dt2); 
System.out.println("Date comparison is " + dateResult); 
boolean stringResult = dt1Text.equals(dt2Text); 
System.out.println("String comparison is " + stringResult); 

输出:

当前日期1:2010-05-10
当前日期2:2010-05-10
日期比较假
字符串比较虚

1
private static final DateFormat df1 = new SimpleDateFormat("yyyyMMdd"); 
    private static Date NOW = new Date(); 
    static { 
     try { 
      NOW = df1.parse(df1.format(new Date())); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
    } 
0

我做了如下,它的工作:

calendar1.set(Calendar.HOUR_OF_DAY, 0); 
calendar1.set(Calendar.AM_PM, 0); 
calendar1.set(Calendar.HOUR, 0); 
calendar1.set(Calendar.MINUTE, 0); 
calendar1.set(Calendar.SECOND, 0); 
calendar1.set(Calendar.MILLISECOND, 0); 
Date date1 = calendar1.getTime();  // Convert it to date 

对您想要比较的其他实例执行此操作。这个逻辑对我有用;我不得不日期它们是否相等或无法比较,但你可以做不同的比较(前,后,等于等)

7

我做了如下,它的工作:(没有时间戳当前日期)

SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy"); 
Date today = dateFormat.parse(dateFormat.format(new Date())); 
4

您可以在此日期前得到:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
print(dateFormat.format(new Date()); 
0

如果你真的想用一个日期,而不是用于比较的日历,这是最短的那一块的代码,你可以使用:

Calendar c = Calendar.getInstance(); 
Date d = new GregorianCalendar(c.get(Calendar.YEAR), 
           c.get(Calendar.MONTH), 
           c.get(Calendar.DAY_OF_MONTH)).getTime(); 

通过这种方式,您可以确保小时/分钟/秒/毫秒值为空白。

0

我正在寻找相同的解决方案,以下为我工作。

Calendar calendar = Calendar.getInstance(); 
    calendar.set(Calendar.HOUR_OF_DAY, 0); 
    calendar.clear(Calendar.HOUR); 
    calendar.clear(Calendar.MINUTE); 
    calendar.clear(Calendar.SECOND); 
    calendar.clear(Calendar.MILLISECOND); 

    Date today = calendar.getTime(); 

请注意,我用的calendar.set(Calendar.HOUR_OF_DAY,0)的HOUR_OF_DAY而不是使用明确的方法,因为它是在Calendar.clear方法的Javadoc建议,如下

HOUR_OF_DAY,HOUR和AM_PM字段是独立处理的,并且 将应用当天时间的解析规则。清除字段中的一个 不会重置此日历的小时数值。 使用设置(Calendar.HOUR_OF_DAY,0)重置小时值。

利用上述贴溶液I得到输出作为

Wed Sep 11 00:00:00 EDT 2013 

使用明确方法,用于在HOUR_OF_DAY 12 12PM之前执行时12PM或00之后执行时重置小时。

8

使用日期格式来解决这个问题:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
DateFormat dateFormat2 = new SimpleDateFormat("MM-dd-yyyy"); 
print(dateFormat.format(new Date()); // will print like 2014-02-20 
print(dateFormat2.format(new Date()); // will print like 02-20-2014 
+0

这是以所需格式获取日期的简单方法。 – Janpan 2014-11-07 08:19:25

1

accepted answer by Jesper是正确的,但现在已经过时。 java.util.Date和.Calendar类是非常麻烦的。避免它们。

java.time

而是使用java.time框架,内置到Java 8和更高版本,back-ported to Java 6 & 7further adapted to Android

如果您真的不关心时间和时区,请在java.time framework()中使用LocalDate

LocalDate localDate = LocalDate.of(2014 , 5 , 6); 

请注意,如果您有任何机会需要处理与其他时区或UTC的,这是错误的路要走。天真的程序员倾向于认为他们实际上不需要时区。

调用toString生成标准ISO 8601格式的字符串。

String output = localDate.toString(); 

2014年5月6日

对于其它的格式,搜索栈溢出了DateTimeFormatter类。

乔达时间

虽然现在java.time取代,您可以使用类似LocalDate类的Joda-Time库(灵感java.time)。

LocalDate localDate = new LocalDate(2014, 5, 6); 
2

您也可以使用Apache的百科全书LIB DateUtils.truncate()

Date now = new Date(); 
Date truncated = DateUtils.truncate(now, Calendar.DAY_OF_MONTH); 

时间将被设置为00:00:00这样你就可以用这个日期工作或打印格式:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

System.out.println(dateFormat.format(now);  // 2010-05-11 11:32:47 
System.out.println(dateFormat.format(truncated); // 2010-05-11 00:00:00 
0

这里我的密码只有日期:

Calendar c=Calendar.getInstance(); 
DateFormat dm = new SimpleDateFormat("dd/MM/yyyy"); 
java.util.Date date = new java.util.Date(); 
System.out.println("current date is : " + dm.format(date));