如何在没有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();
更新 :
-
我知道约达时代 ; 我只是试图避免这样一个简单的(我认为)任务的额外的图书馆。 但根据迄今为止的答案,Joda-Time似乎非常受欢迎,所以我可能会考虑它。
-
通过高效 ,我的意思是我想避免
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.util
types – 它们通常是更好的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.Date
是java.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!