如何在Java中没有时间获取日期?

Ros*_*sim 226 java date

继续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)

更新:

  1. 我知道Joda-Time ; 我只是想为这么简单(我认为)的任务避免使用额外的库.但基于迄今为止的答案,Joda-Time似乎非常受欢迎,所以我可能会考虑它.

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

Jon*_*eet 108

你绝对必须使用java.util.Date?我完全建议您使用Joda Timejava.timeJava 8中的包.特别是,虽然日期和日历总是代表一个特定的时刻,没有"只是一个日期"的概念,Joda Time 确实有一个代表this(LocalDate)的类型.如果您能够使用代表您实际尝试的类型,那么您的代码将更加清晰.

使用Joda Time或者使用java.time内置java.util类型有很多其他原因- 它们通常是更好的API.java.util.Date如果需要,您可以随时在您自己的代码的边界转换为/ ,例如,用于数据库交互.

  • 在企业应用程序中,我们并不总是可以选择添加/使用其他库.我很欣赏指向Joda Time的指针,但它确实不能解决使用标准Java获取日期部分的原始问题.谢谢.Upthoting Chathuranga的回答. (67认同)
  • "在企业应用程序中,我们并不总是可以选择添加/使用其他库".真的吗?您是否建议您不能使用第三方库? (7认同)
  • @noogrub:Chathugranga的回答没有回答原来的问题,即询问如何获得一个`Date`对象 - 回答*格式化*一个字符串的日期,这不是一回事.从根本上说,询问"日期"的日期是没有更多信息的无意义问题:您正在使用的时区和日历系统. (3认同)
  • 我认为@BrianAgnew noogrub的评论似乎与非技术限制有关 (3认同)
  • 从今天的角度来看:"[Joda-Time](http://www.joda.org/joda-time/)是Java SE 8之前Java的事实标准日期和时间库.现在要求用户迁移到java.time(JSR-310)." (3认同)

小智 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)

  • 这与原始问题中已经提出的"方法1"有什么不同? (28认同)

小智 55

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

例:

DateUtils.truncate(new Date(), java.util.Calendar.DAY_OF_MONTH)
Run Code Online (Sandbox Code Playgroud)

  • +1 @Dibbeke区别不只是你要添加一个库而不是另一个库.有时候人们不想仅仅因为截断日期的时间这个简单的任务而学习一个全新的库.或者不希望将日期/日历与Joda日期混合使用的代码有时使用前者,有时使用后者.或者无法承担/证明将所有运行良好的基于​​日期/日历的代码替换为另一个库以实现这样一个微不足道的目的.虽然建议Joda肯定是好的,因为它显然是优越的,简单的正确的事情,有时真正的生活开始. (6认同)
  • 如果你要添加一个新库,那就让它成为Joda而不是Apache Commons. (3认同)

Bas*_*que 35

除了这两个还有其他方法吗?

就在这里.

LocalDate.now( 
    ZoneId.of( "Pacific/Auckland" ) 
)
Run Code Online (Sandbox Code Playgroud)

java.time

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.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)

  • 对我来说,这是目前:"2月19日星期六**01**:2011年中欧时间00:00".如果您想使用它,那么只能使用UTC. (5认同)
  • 它不是,因为整数数学.可以把它想象成Math.floor(currentTime/millisInDay)*millisInDay.他有效地将时间设置为00:00:00. (5认同)
  • 不是第3行`long dateOnly =(currentTime/millisInDay)*millisInDay;`与写`long dateOnly = currentTime;`相同? (4认同)
  • 对于大多数应用来说,这个解决方案可能很好,但要注意一天60*60*24*1000的假设并非总是如此.例如,您可以在某些日子里获得闰秒. (2认同)
  • 与其他 1 行和 2 行清晰简洁的方法相比,这可以说是最迟钝且不推荐的方式。 (2认同)

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)


Gle*_*len 8

这是一种简单的方法:

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

  • 该答案无法解决该问题。目标不是获得格式化的字符串。 (4认同)

Tho*_*sen 7

关于标准java运行时中的Date例程,没有时间戳的日期是没有意义的,因为它实际上映射到特定的毫秒而不是日期.所述毫秒本身具有与其相关的时间,这使得它易受诸如夏令时和其他日历调整之类的时区问题的影响.看看为什么减去这两次(1927年)给出一个奇怪的结果?一个有趣的例子.

如果您想使用日期而不是毫秒,则需要使用其他内容.对于Java 8,有一组新的方法可以提供您所要求的内容.对于Java 7及更早版本,请使用http://www.joda.org/joda-time/

  • 注意:那些说"午夜约会"的方法不能很好地处理夏令时和多个时区. (3认同)

Big*_*c66 5

如果您只想查看像“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


blu*_*xff 5

// 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)