继续Stack Overflow问题Java程序以获取没有时间戳的当前日期:
没有时间获取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();
Run Code Online (Sandbox Code Playgroud)
更新:
我知道Joda-Time ; 我只是想为这么简单(我认为)的任务避免使用额外的库.但基于迄今为止的答案,Joda-Time似乎非常受欢迎,所以我可能会考虑它.
通过高效,我的意思是我想避免使用临时对象String创建method 1,同时method 2看起来像是黑客而不是解决方案.
Jon*_*eet 108
你绝对必须使用java.util.Date?我完全建议您使用Joda Time或java.timeJava 8中的包.特别是,虽然日期和日历总是代表一个特定的时刻,没有"只是一个日期"的概念,Joda Time 确实有一个代表this(LocalDate)的类型.如果您能够使用代表您实际尝试的类型,那么您的代码将更加清晰.
使用Joda Time或者使用java.time内置java.util类型有很多其他原因- 它们通常是更好的API.java.util.Date如果需要,您可以随时在您自己的代码的边界转换为/ ,例如,用于数据库交互.
小智 63
以下是我过去今天的日期,时间设置为00:00:00:
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
Date today = new Date();
Date todayWithZeroTime = formatter.parse(formatter.format(today));
Run Code Online (Sandbox Code Playgroud)
小智 55
您可以使用Apache Commons库中的DateUtils.truncate.
例:
DateUtils.truncate(new Date(), java.util.Calendar.DAY_OF_MONTH)
Run Code Online (Sandbox Code Playgroud)
Bas*_*que 35
除了这两个还有其他方法吗?
就在这里.
LocalDate.now(
ZoneId.of( "Pacific/Auckland" )
)
Run Code Online (Sandbox Code Playgroud)
Java 8及更高版本附带了内置的新java.time包.请参阅教程.大部分java.time功能都在ThreeTen- Backport中反向移植到Java 6和7,并进一步适用于ThreeTenABP中的 Android .
与Joda-Time类似,java.time提供了一个LocalDate类来表示没有时间和没有时区的仅日期值.
请注意,时区对于确定特定日期至关重要.例如,在巴黎的午夜时分,蒙特利尔的日期仍然是"昨天".
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;
Run Code Online (Sandbox Code Playgroud)
默认情况下,java.time使用ISO 8601标准生成日期或日期时间值的字符串表示形式.(与Joda-Time的另一个相似之处.)因此,只需调用toString()生成文本即可2015-05-21.
String output = today.toString() ;
Run Code Online (Sandbox Code Playgroud)
该java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.
现在处于维护模式的Joda-Time项目建议迁移到java.time类.
要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.
从哪里获取java.time类?
该ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.
Rom*_*man 22
最直截了当的方式:
long millisInDay = 60 * 60 * 24 * 1000;
long currentTime = new Date().getTime();
long dateOnly = (currentTime / millisInDay) * millisInDay;
Date clearDate = new Date(dateOnly);
Run Code Online (Sandbox Code Playgroud)
Bri*_*new 21
这些问题的标准答案是使用Joda Time.API更好,如果你使用格式化程序和解析器,你可以避免非直观的缺乏线程安全性SimpleDateFormat.
使用Joda意味着你可以简单地做:
LocalDate d = new LocalDate();
Run Code Online (Sandbox Code Playgroud)
更新::使用java 8,可以使用它
LocalDate date = LocalDate.now();
Run Code Online (Sandbox Code Playgroud)
这是一种简单的方法:
Calendar cal = Calendar.getInstance();
SimpleDateFormat dateOnly = new SimpleDateFormat("MM/dd/yyyy");
System.out.println(dateOnly.format(cal.getTime()));
Run Code Online (Sandbox Code Playgroud)
关于标准java运行时中的Date例程,没有时间戳的日期是没有意义的,因为它实际上映射到特定的毫秒而不是日期.所述毫秒本身具有与其相关的时间,这使得它易受诸如夏令时和其他日历调整之类的时区问题的影响.看看为什么减去这两次(1927年)给出一个奇怪的结果?一个有趣的例子.
如果您想使用日期而不是毫秒,则需要使用其他内容.对于Java 8,有一组新的方法可以提供您所要求的内容.对于Java 7及更早版本,请使用http://www.joda.org/joda-time/
如果您只想查看像“YYYY-MM-DD”这样的日期,而没有其他混乱,例如“Thu May 21 12:08:18 EDT 2015”,那么只需使用java.sql.Date. 此示例获取当前日期:
new java.sql.Date(System.currentTimeMillis());
Run Code Online (Sandbox Code Playgroud)
也是java.sql.Date的子类java.util.Date。
// 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
392844 次 |
| 最近记录: |