在Java中获取当前日期/时间的最佳方法是什么?


当前回答

Use:

String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());
System.out.println(timeStamp );

(它起作用了。)

其他回答

您可以自己使用Date对象和格式。很难格式化并且需要更多的代码,

Date dateInstance = new Date();
int year = dateInstance.getYear()+1900;//Returns:the year represented by this date, minus 1900.
int date = dateInstance.getDate();
int month = dateInstance.getMonth();
int day = dateInstance.getDay();
int hours = dateInstance.getHours();
int min = dateInstance.getMinutes();
int sec = dateInstance.getSeconds();

String dayOfWeek = "";
switch(day){
    case 0:
        dayOfWeek = "Sunday";
        break;
    case 1:
        dayOfWeek = "Monday";
        break;
    case 2:
        dayOfWeek = "Tuesday";
        break;
    case 3:
        dayOfWeek = "Wednesday";
        break;
    case 4:
        dayOfWeek = "Thursday";
        break;
    case 5:
        dayOfWeek = "Friday";
        break;
    case 6:
        dayOfWeek = "Saturday";
        break;
}
System.out.println("Date: " + year +"-"+ month + "-" + date + " "+ dayOfWeek);
System.out.println("Time: " + hours +":"+ min + ":" + sec);

输出:

Date: 2017-6-23 Sunday
Time: 14:6:20

正如您所看到的,这是最糟糕的方法,根据oracle文档,它已被弃用。

Oracle文档:

类Date表示特定的时间瞬间,以毫秒为单位精确在JDK1.1之前,Date类有两个额外的函数。它允许将日期解释为年、月、日、小时、分钟、,和第二值。它还允许格式化和解析日期串。不幸的是,这些函数的API不适用国际化。从JDK1.1开始,Calendar类应该是用于在日期和时间字段与DateFormat类之间转换应用于格式化和解析日期字符串。相应的Date中的方法已弃用。

因此,您也可以使用Calendar类,

Calendar.YEAR;
//and lot more

要获取当前时间,可以使用:

Calendar rightNow = Calendar.getInstance();

文件:与其他区域设置敏感类一样,Calendar提供了一个类方法,getInstance,用于获取此类型的通常有用的对象。Calendar的getInstance方法返回其日历字段已用当前日期和时间初始化

以下代码用于获取唯一日期

Date rightNow = Calendar.getInstance().getTime();
System.out.println(rightNow);

此外,Calendar类具有子类。GregorianCalendar是其中之一,也是日历的具体子类,它提供了世界上大多数人使用的标准日历系统。

使用GregorianLendar的示例:

Calendar cal = new GregorianCalendar();
int hours = cal.get(Calendar.HOUR);
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);
int ap = cal.get(Calendar.AM_PM);

String amVSpm;
if(ap == 0){
    amVSpm = "AM";
}else{
    amVSpm = "PM";
}

String timer = hours + "-" + minute + "-" + second + " " +amVSpm;
System.out.println(timer);

您可以使用SimpleDateFormat,一种简单快速的日期格式设置方法:

String pattern = "yyyy-MM-dd";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);

String date = simpleDateFormat.format(new Date());
System.out.println(date);

阅读Jakob Jenkov教程:Java SimpleDateFormat。

正如其他人提到的,当我们需要从日期进行操作时,我们没有简单而最佳的方法,或者我们无法满足内置类、API的要求。

例如,当我们需要在两个日期之间进行比较时,当我们要比较两个日期时(也有内置的方法),等等。我们不得不使用第三方图书馆。其中一个好的和受欢迎的是Joda Time。

另请阅读:

如何在Joda time中正确获取当前日期和时间?JodaTime-如何获取UTC的当前时间JodaTime示例。下载Joda

.最开心的事情是现在(在java8中),没有人因为任何原因需要下载和使用库。一个在Java 8中获取当前日期和时间的简单示例,

LocalTime localTime = LocalTime.now();
System.out.println(localTime);

//with time zone
LocalTime localTimeWtZone = LocalTime.now(ZoneId.of("GMT+02:30"));
System.out.println(localTimeWtZone);

一篇关于Java8日期的好博文。

记住要了解更多关于Java日期和时间的信息,因为有很多方法和/或有用的方法可以获取/使用。

日期和时间的Oracle教程。Oracle格式化程序教程。课:标准日历。

编辑:

根据@BasilBourque的评论,像java.util.date、java.util.Calendar和java.text.SimpleTextFormat这样麻烦的旧日期时间类现在已经过时,取而代之的是java.time类。

Use:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy:MM:dd::HH:mm:ss");
System.out.println(sdf.format(System.currentTimeMillis()));

print语句将打印调用它的时间,而不是创建SimpleDateFormat的时间。因此,可以在不创建任何新对象的情况下重复调用它。

如果希望当前日期为字符串,请尝试以下操作:

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date();
System.out.println(dateFormat.format(date));

or

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
System.out.println(dateFormat.format(cal.getTime()));

http://www.mkyong.com/java/java-how-to-get-current-date-time-date-and-calender/

tl;博士

Instant.now()                         // Capture the current moment in UTC, with a resolution of nanoseconds. Returns a `Instant` object.

…或…

ZonedDateTime.now(                    // Capture the current moment as seen in…
    ZoneId.of( "America/Montreal" )   // … the wall-clock time used by the people of a particular region (a time zone).
)                                     // Returns a `ZonedDateTime` object.

java时间

一些答案提到java.time类是与最早版本的java捆绑在一起的麻烦的旧式日期时间类的现代替代品。以下是更多信息。

时区

其他答案未能解释时区对确定当前日期和时间的重要性。对于任何给定的时刻,日期和时间在全球各地因地区而异。例如,午夜过后几分钟,在法国巴黎是新的一天,而在魁北克省蒙特利尔,这一天仍然是“昨天”。

瞬间

作为最佳实践,您的大部分业务逻辑和数据存储/交换应该在UTC中完成。

要以纳秒为单位获得UTC中的当前时刻,请使用Instant类。传统的计算机硬件时钟精度有限,因此当前时刻可能以毫秒或微秒而不是纳秒为单位。

Instant instant = Instant.now();

区域日期时间

您可以将“即时”调整到其他时区。应用ZoneId对象以获取ZonedDateTime。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

我们可以跳过即时,直接获取当前的ZonedDateTime。

ZonedDateTime zdt = ZonedDateTime.now( z );

始终传递可选的时区参数。如果省略,则应用JVM的当前默认时区。默认值可以随时更改,即使在运行时也是如此。不要让你的应用受到你无法控制的外部因素的影响。始终指定所需/预期的时区。

ZonedDateTime do_Not_Do_This = ZonedDateTime.now(); // BAD - Never rely implicitly on the current default time zone.

您可以稍后从ZonedDateTime中提取Instant。

Instant instant = zdt.toInstant();

如果您需要时间线上的实际时刻,请始终使用Instant或ZonedDateTime,而不是LocalDateTime。“本地…”类型故意没有时区的概念,因此它们只代表一个可能时刻的粗略概念。要获得实际时刻,必须指定一个时区,以将Local…类型转换为ZonedDateTime,从而使其具有意义。

本地日期

LocalDate类表示一个仅日期的值,没有时间和时区。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );  // Always pass a time zone.

要生成表示日期时间值的字符串,只需对标准ISO 8601格式的java.time类调用toString。

String output = myLocalDate.toString();  // 2016-09-23

…或…

String output = zdt.toString();  // 2016-09-23T12:34:56.789+03:00[America/Montreal]

ZonedDateTime类通过在方括号中明智地附加时区名称来扩展标准格式。

对于其他格式,请在堆栈溢出中搜索DateTimeFormatter类上的许多问题和答案。

避免LocalDateTime

与RamanSB对该问题的评论相反,您不应将LocalDateTime类用于当前日期时间。

LocalDateTime故意缺少UTC信息的任何时区或偏移量。因此,当您跟踪时间线上的特定时刻时,这是不合适的。当然不适合捕捉当前时刻。

LocalDateTime只有日期和时间,例如“2020年1月23日中午”,但我们不知道这是日本东京的中午还是美国俄亥俄州托莱多的中午,两个不同的时刻相隔很多小时。

“本地”的措辞与直觉相悖。它意味着任何地点,而不是任何一个特定地点。例如,今年的圣诞节从12月25日午夜开始:2017-12-25T00:00,表示为LocalDateTime。但这意味着午夜在全球不同的时间点。午夜首先发生在基里巴斯,随后发生在新西兰,几个小时后发生在印度,依此类推,在法国,圣诞节开始前又过了几个小时,而加拿大的孩子们仍在等待这一天。这些圣诞起点中的每一个都将表示为单独的ZonedDateTime。


从系统外部

如果您不能信任系统时钟,请参阅Java:从服务器获取当前日期和时间,而不是系统时钟和我的答案。

java.time.Clock(java.time.Clock)

要利用当前时刻的替代供应商,请编写抽象java.time.Clock类的子类。

您可以将Clock实现作为参数传递给各种java.time方法。例如,Instant.now(时钟)。

Instant instant = Instant.now( yourClockGoesHere ) ;

出于测试目的,请注意Clock本身静态可用的Clock替代实现:固定、偏移、滴答等等。


关于java.time

java.time框架内置于Java8和更高版本中。这些类取代了麻烦的旧式日期时间类,如java.util.date、Calendar和SimpleDateFormat。

要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。规范为JSR 310。

现在处于维护模式的Joda Time项目建议迁移到java.Time类。

您可以直接与数据库交换java.time对象。使用符合JDBC4.2或更高版本的JDBC驱动程序。不需要字符串,也不需要java.sql.*类。

从哪里获取java.time类?

Java SE 8、Java SE 9、Java SE 10、Java SE 11和更高版本—标准Java API的一部分,带有捆绑实现。Java9添加了一些小功能和修复。Java SE 6和Java SE 7大多数java.time功能在ThreeTen Backport中被向后移植到java 6和7。安卓java.time类的Android捆绑包实现的更高版本。对于早期的Android(<26),ThreeTenABP项目采用ThreeTen Backport(如上所述)。请参阅如何使用ThreeTenABP…。

ThreeTen Extra项目使用其他类扩展java.time。这个项目是未来可能添加java.time的试验场。您可以在这里找到一些有用的类,如Interval、YearWeek、YearQuarter等。

创建日期对象并将其打印下来。

Date d = new Date(System.currentTimeMillis());
System.out.print(d);