如何在没有Java的情况下获取date?

继续从堆栈溢出问题Java程序获取当前date没有时间戳

没有时间的情况下获取Date对象的最有效方法是什么? 除了这两个还有别的方法吗?

// Method 1 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date dateWithoutTime = sdf.parse(sdf.format(new Date())); // Method 2 Calendar cal = Calendar.getInstance(); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); dateWithoutTime = cal.getTime(); 

更新

  1. 我知道约达时代 ; 我只是试图避免这样一个简单的(我认为)任务的额外的图书馆。 但根据迄今为止的答案,Joda-Time似乎非常受欢迎,所以我可能会考虑它。

  2. 通过高效 ,我的意思是我想避免method 1使用的临时对象String创build,同时method 2看起来像是一个黑客而不是解决scheme。

你绝对必须使用java.util.Date ? 我会彻底build议您使用Joda Time或Java 8的java.time包。 特别是,“date”和“日历” 总是代表特定的时间,而“没有date”的概念没有,Joda时间确实有一个表示这个( LocalDate )的types。 如果您能够使用代表您实际正在尝试执行的types,那么您的代码将会更清晰。

有许多其他许多原因使用Joda Time或java.time代替内置的java.utiltypes – 它们通常是更好的API。 如果需要的话,您可以在自己的代码的边界上始终转换为/来自java.util.Date ,例如用于数据库交互。

以下是我用今天的date设定为00:00:00时间:

 DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); Date today = new Date(); Date todayWithZeroTime = formatter.parse(formatter.format(today)); 

您可以使用Apache Commons库中的DateUtils.truncate 。

例:

 DateUtils.truncate(new Date(), java.util.Calendar.DAY_OF_MONTH) 

除了这两个还有别的方法吗?

就在这里。

 LocalDate.now( ZoneId.of( "Pacific/Auckland" ) ) 

java.time

Java 8及更高版本随附了新的内置的java.time包 。 参见教程 。 大部分的java.timefunction在ThreeTen- Backport中被移植到Java 6&7中,并在ThreeTenABP中进一步适应Android。

类似于Joda-Time ,java.time提供了一个LocalDate类来表示没有时间和没有时区的只有date的值。

请注意, 时区对确定特定date至关重要 。 例如,在巴黎午夜的时候,蒙特利尔的date仍然是“昨天”。

 LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ; 

默认情况下,java.time使用ISO 8601标准生成date或date时间值的string表示forms。 (与Joda-Time的另一个相似之处。)所以简单地调用toString() 2015-05-21成像2015-05-21这样的文本。

 String output = today.toString() ; 

最简单的方法是:

 long millisInDay = 60 * 60 * 24 * 1000; long currentTime = new Date().getTime(); long dateOnly = (currentTime / millisInDay) * millisInDay; Date clearDate = new Date(dateOnly); 

这些问题的标准答案是使用乔达时间 。 API是更好的,如果你使用格式化器和分析器,你可以避免SimpleDateFormat的线程安全性的不直观的缺乏。

使用乔达意味着你可以简单地做:

 LocalDate d = new LocalDate(); 

更新::使用java 8这可以使用

 LocalDate date = LocalDate.now(); 

在标准java运行库中,没有关于date例程的时间戳,因为它基本上映射到特定的毫秒而不是date,所以没有什么意义。 所述毫秒本质上具有附加的时间,这使得它容易受夏时制时间和其他日历调整等时区问题的影响。 看到为什么要减去这两个(在1927年)给出一个奇怪的结果? 一个有趣的例子。

如果你想使用date而不是毫秒,你需要使用别的东西。 对于Java 8,有一套新的方法可以提供你所要求的。 对于Java 7和更早版本,请使用http://www.joda.org/joda-time/

那么,据我所知,如果只使用标准的JDK,那么没有更简单的方法来实现这一点。

当然,您可以将方法2中的逻辑放入辅助类的静态函数中,就像toBeginningOfTheDay方法

那么你可以缩短第二种方法来:

 Calendar cal = Calendar.getInstance(); Calendars.toBeginningOfTheDay(cal); dateWithoutTime = cal.getTime(); 

或者,如果你经常需要这种格式的当前date,那么你可以把它包装在另一个静态帮助器的方法,从而使其成为一个单线程。

绝对不是最正确的方法,但如果你只是需要一个快速的解决scheme来获得没有时间的date,你不希望使用第三方库这应该做的

  Date db = db.substring(0, 10) + db.substring(23,28); 

我只需要视觉目的的date,不能乔达,所以我substringed。

如果你只想看到像“YYYY-MM-DD”那样的date,而没有其他所有的混乱,例如“Thu May 21 12:08:18 EDT 2015”,那么就使用java.sql.Date 。 这个例子获取当前date:

 new java.sql.Date(System.currentTimeMillis()); 

另外java.sql.Datejava.util.Date一个子类。

这是一个简单的方法:

 Calendar cal = Calendar.getInstance(); SimpleDateFormat dateOnly = new SimpleDateFormat("MM/dd/yyyy"); System.out.println(dateOnly.format(cal.getTime())); 

如果你需要date部分只是为了回应的目的,那么

 Date d = new Date(); String dateWithoutTime = d.toString().substring(0, 10); 
 // 09/28/2015 System.out.println(new SimpleDateFormat("MM/dd/yyyy").format(Calendar.getInstance().getTime())); // Mon Sep 28 System.out.println( new Date().toString().substring(0, 10) ); // 2015-09-28 System.out.println(new java.sql.Date(System.currentTimeMillis())); // 2015-09-28 // java 8 System.out.println( LocalDate.now(ZoneId.of("Europe/Paris")) ); // rest zones id in ZoneId class 

如果你只是需要现在的date,没有时间,另一种select是:

 DateTime.now().withTimeAtStartOfDay() 

退房Veyder时间 。 这是java.util和Joda-time的一个简单而有效的select。 它有一个直观的API和类,只表示date,没有时间戳。

充分利用Java的巨大TimeZone数据库的最直接的方式是正确的:

 long currentTime = new Date().getTime(); long dateOnly = currentTime + TimeZone.getDefault().getOffset(currentTime); 

这是一个干净的解决scheme,不需要转换为string,也不需要重新计算时间,因为您将每个时间组件重置为零。 它也使用% (模数)而不是除以乘以避免双重操作。

它不需要任何第三方依赖关系,并且它对传入的Calender对象的时区进行了重置。此函数返回您传递的date(Calendar)时区的上午12点。

 public static Calendar date_only(Calendar datetime) { final long LENGTH_OF_DAY = 24*60*60*1000; long millis = datetime.getTimeInMillis(); long offset = datetime.getTimeZone().getOffset(millis); millis = millis - ((millis + offset) % LENGTH_OF_DAY); datetime.setTimeInMillis(millis); return datetime; } 

尽可能不要使用第三方库。 我知道这种方式是之前提到的,但是这里有一个很好的干净的方法:

  /* Return values: -1: Date1 < Date2 0: Date1 == Date2 1: Date1 > Date2 -2: Error */ public int compareDates(Date date1, Date date2) { SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyy"); try { date1 = sdf.parse(sdf.format(date1)); date2 = sdf.parse(sdf.format(date2)); } catch (ParseException e) { e.printStackTrace(); return -2; } Calendar cal1 = new GregorianCalendar(); Calendar cal2 = new GregorianCalendar(); cal1.setTime(date1); cal2.setTime(date2); if(cal1.equals(cal2)) { return 0; } else if(cal1.after(cal2)) { return 1; } else if(cal1.before(cal2)) { return -1; } return -2; } 

那么,不使用GregorianCalendar也许是一个select!