如何在Java中获取当前日期/时间

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

2171819 次浏览

你看过java.util.日期吗?这正是你想要的。

只需创建一个Date对象…

import java.util.Date;
Date date = new Date();

看看日期类。还有较新的日历类,它是执行许多日期/时间操作的首选方法(Date上的许多方法已被弃用)。

如果您只是想要当前日期,那么要么创建一个新的Date对象,要么调用Calendar.getInstance();

这取决于您想要的日期/时间:

  • 如果您希望日期/时间为单个数值,则System.currentTimeMillis()会为您提供该值,表示为UNIX纪元后的毫秒数(Javalong)。此值是UTC时间点的增量,独立于本地时区1

  • 如果您希望日期/时间的格式允许您以数字方式访问组件(年、月等),您可以使用以下之一:

    • new Date()为您提供了一个使用当前日期/时间初始化的Date对象。问题是Date API方法大多存在缺陷……并且不建议使用。

    • Calendar.getInstance()为您提供了一个使用当前日期/时间初始化的Calendar对象,使用默认的LocaleTimeZone。其他重载允许您使用特定的Locale和/或TimeZone。日历有效…但API仍然很麻烦。

    • new org.joda.time.DateTime()为您提供了一个Joda-time对象,使用默认时区和年表使用当前日期/时间初始化。还有很多其他Joda替代品……太多了,无法在这里描述。(但请注意,有些人报告Joda time有性能问题。;例如https://stackoverflow.com/questions/6280829.

    • 在Java8中,调用java.time.LocalDateTime.now()java.time.ZonedDateTime.now()将为您提供当前日期/时间的表示2

在Java8之前,大多数了解这些事情的人都推荐Joda-time具有(到目前为止)最好的JavaAPI来处理涉及时间点和持续时间计算的事情。

在Java8及更高版本中,建议使用标准的java.time包。Joda时间现在被认为是“过时的”,Joda维护者建议人们迁移。3


1-System.currentTimeMillis()给出“系统”时间。虽然系统时钟设置为(标称)UTC是正常做法,但本地UTC时钟和真实UTC时钟之间会有差异(增量)。增量的大小取决于系统时钟与UTC同步的程度(以及频率)。
2-请注意LocalDateTime不包括时区。正如javadoc所说:“如果没有偏移量或时区等附加信息,它就不能代表时间线上的瞬间。
3-注意:如果你不迁移,你的Java8代码不会中断,但Joda代码库最终可能会停止获取bug修复和其他补丁。截至2020-02年,Joda的官方“生命终结”尚未宣布,Joda API尚未标记为已弃用。

java.util.Date date = new java.util.Date();

它会自动填充实例化的时间。

如前所述,基本的Date()可以在获取当前时间方面做你需要做的事情。在我最近大量使用Java日期的经验中,内置类有很多奇怪之处(以及许多Date类方法的弃用)。对我来说,一个奇怪的地方是月份是基于0索引的,从技术角度来看这是有道理的,但实际上可能非常混乱。

如果你只关心当前日期,那就足够了——但是,如果你打算对日期进行大量的操作/计算,那么使用第三方库可能会非常有益(这么多的存在是因为许多Java开发人员对内置功能不满意)。

我支持Stephen C的建议,因为我发现Joda-time在简化我的日期工作方面非常有用,它也有很好的文档记录,你可以在整个网络上找到许多有用的例子。我甚至最终编写了一个静态包装类(作为DateUtils),我用它来巩固和简化我所有常见的日期操作。

(注意:仅适用于Java版本<8。Java8+请查看其他回复。)

如果您只需要以YYYY.MM.DD-HH.MM.SS格式输出时间戳(非常常见的情况),那么以下是执行此操作的方法:

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

用途:

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

(它正在工作。

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

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

如果您希望当前日期为String,请尝试以下操作:

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

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/

类似于上面的解决方案。但我总是发现自己在寻找这块代码:

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

Java8中:

LocalDateTime.now()

如果您需要时区信息:

ZonedDateTime.now()

如果你想打印花哨的格式化字符串:

System.out.println(ZonedDateTime.now().format(DateTimeFormatter.RFC_1123_DATE_TIME))

我认为这是最好的方法:

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");Calendar cal = Calendar.getInstance();System.out.println(dateFormat.format(cal.getTime())); // 2014/08/06 16:00:22
    // 2015/09/27 15:07:53System.out.println( new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(Calendar.getInstance().getTime()) );
// 15:07:53System.out.println( new SimpleDateFormat("HH:mm:ss").format(Calendar.getInstance().getTime()) );
// 09/28/2015System.out.println(new SimpleDateFormat("MM/dd/yyyy").format(Calendar.getInstance().getTime()));
// 20150928_161823System.out.println( new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime()) );
// Mon Sep 28 16:24:28 CEST 2015System.out.println( Calendar.getInstance().getTime() );
// Mon Sep 28 16:24:51 CEST 2015System.out.println( new Date(System.currentTimeMillis()) );
// Mon Sep 28System.out.println( new Date().toString().substring(0, 10) );
// 2015-09-28System.out.println( new java.sql.Date(System.currentTimeMillis()) );
// 14:32:26Date d = new Date();System.out.println( (d.getTime() / 1000 / 60 / 60) % 24 + ":" + (d.getTime() / 1000 / 60) % 60 + ":" + (d.getTime() / 1000) % 60 );
// 2015-09-28 17:12:35.584System.out.println( new Timestamp(System.currentTimeMillis()) );
// Java 8
// 2015-09-28T16:16:23.308+02:00[Europe/Belgrade]System.out.println( ZonedDateTime.now() );
// Mon, 28 Sep 2015 16:16:23 +0200System.out.println( ZonedDateTime.now().format(DateTimeFormatter.RFC_1123_DATE_TIME) );
// 2015-09-28System.out.println( LocalDate.now(ZoneId.of("Europe/Paris")) ); // rest zones id in ZoneId class
// 16System.out.println( LocalTime.now().getHour() );
// 2015-09-28T16:16:23.315System.out.println( LocalDateTime.now() );

第一了解java.util.Date类

1.1如何获取当前日期

import java.util.Date;
class Demostration{public static void main(String[]args){Date date = new Date(); // date objectSystem.out.println(date); // Try to print the date object}}

1.2如何使用getTime()方法

import java.util.Date;public class Main {public static void main(String[]args){Date date = new Date();long timeInMilliSeconds = date.getTime();System.out.println(timeInMilliSeconds);}}

这将返回自1970年1月1日00:00:00 GMT以来的毫秒数,用于时间比较。

1.3如何使用SimpleDateFormat类格式化时间

import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;
class Demostration{public static void main(String[]args){Date date=new Date();DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");String formattedDate=dateFormat.format(date);System.out.println(formattedDate);}}

还要尝试使用不同的格式模式,例如“yyyy-MM-dd hh: mm: ss”并选择所需的模式。http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

第二了解java.util.日历类

2.1使用日历类获取当前时间戳

import java.util.Calendar;
class Demostration{public static void main(String[]args){Calendar calendar=Calendar.getInstance();System.out.println(calendar.getTime());}}

2.2尝试使用setTime和其他set方法将日历设置为不同的日期。

来源:http://javau91.blogspot.com/

用途:

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

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

import java.util.*;import java.text.*;
public class DateDemo {public static void main(String args[]) {Date dNow = new Date( );SimpleDateFormat ft =new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");System.out.println("Current Date: " + ft.format(dNow));}}

您可以使用日期为fet当前数据。所以使用SimpleDateFormat获取格式

tl; dr

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

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

在此处输入图片描述

时区

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

Instant

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

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

Instant instant = Instant.now();

ZonedDateTime

您可以将Instant调整到其他时区。应用ZoneId对象以获得ZonedDateTime

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

我们可以跳过Instant并直接获取当前的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();

当你想要在时间轴上获得一个实际的时刻时,总是使用InstantZonedDateTime而不是LocalDateTimeLocal…类型故意没有时区的概念,所以它们只代表一个可能时刻的粗略概念。要获得一个实际的时刻,你必须分配一个时区来将Local…类型转换为ZonedDateTime,从而使其有意义。

LocalDate

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

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

弦乐

要生成表示日期时间值的String,只需在标准ISO8601格式的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类通过明智地将时区名称附加在方括号中来扩展标准格式。

对于其他格式,在Stack Overflow中搜索DateTimeFormatter类上的许多问题和答案。

避免LocalDateTime

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

LocalDateTime故意缺少任何时区或从UTC偏移的信息。因此,当您在时间轴上跟踪特定时刻时,这是没有合适的。当然,没有适合捕获当前时刻。

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

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


在你的系统之外

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

一对外部无线电时钟设备的照片

java.time.Clock

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

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

Instant instant = Instant.now( yourClockGoesHere ) ;

出于测试目的,请注意Clock本身静态可用的Clock的替代实现:fixedoffsettick等。


关于java.time

java.time框架内置于Java8及更高版本中。这些类取代了麻烦的旧遗产日期时间类,例如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获取许多示例和解释。规格是JSR 310

Joda-Time项目,现在在维护模式中,建议迁移到java.time类。

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

在哪里可以获得java.time?

哪个java.time库与哪个版本的Java或Android一起使用的表

<强>三个十-额外项目通过附加类扩展了java.time。该项目是未来可能添加到java.time.的试验场。您可以在此处找到一些有用的类,例如IntervalYearWeekYearQuarter更多

你可以自己使用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 SundayTime: 14:6:20

正如你所看到的,这是最糟糕的方法,根据甲骨文留档,它是已弃用

oracledoc:

Date类表示时间上的特定瞬间,以毫秒为单位精确。

在JDK 1.1之前,Date类有两个附加函数。它允许将日期解释为年,月,日,小时,分钟,和第二个值。它还允许日期的格式和解析字符串。不幸的是,这些函数的API不适合到国际化。从JDK 1.1开始,日历类应该是用于在日期和时间字段以及DateFormat类之间进行转换应用于格式化和解析日期字符串。相应的Date中的方法已弃用。

或者,您可以使用Calendar类,

Calendar.YEAR;//and lot more

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

Calendar rightNow = Calendar.getInstance();

文档:

与其他语言环境敏感的类一样,Calendar提供了一个类方法,getInstance,用于获取这种类型的通常有用的对象。日历的getInstance方法返回一个Calendar对象,其日历字段已使用当前日期和时间初始化

下面的代码只获取日期

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

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

使用GregorianCalendar的示例:

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教程:JavaSimpleDateFormat

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

例如,当我们需要在两次约会之间有所不同时,当我们需要比较两个日期(也有内置的方法)等等时。我们不得不使用第三方库。其中一个好的和流行的是Joda时间。

另请阅读:

。最开心的事情是现在(在java 8中),没有人需要以任何理由下载和使用库。在Java8中获取当前日期和时间的简单示例,

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

很好的博客文章阅读关于Java8日期之一。

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

编辑:

根据@BasilBourque的评论,麻烦的旧日期时间类,如java.util.Datejava.util.Calendarjava.text.SimpleTextFormat现在是遗产,被#3类取代。

对于java.util.Date,只需创建一个新的Date()

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

对于java.util.日历,使用Calendar.get实例()

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");Calendar cal = Calendar.getInstance();System.out.println(dateFormat.format(cal)); //2016/11/16 12:08:43

java.time.LocalDateTime,使用LocalDateTime.now()

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");LocalDateTime now = LocalDateTime.now();System.out.println(dtf.format(now)); //2016/11/16 12:08:43

对于java.time.LocalDate,使用LocalDate.now()

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd");LocalDate localDate = LocalDate.now();System.out.println(dtf.format(localDate)); //2016/11/16

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

我会继续把这个答案扔进去,因为当我有同样的问题时,这就是我所需要的:

Date currentDate = new Date(System.currentTimeMillis());

currentDate现在是JavaDate对象中的当前日期。

 System.out.println( new SimpleDateFormat("yyyy:MM:dd - hh:mm:ss a").format(Calendar.getInstance().getTime()) );//2018:02:10 - 05:04:20 PM

日期/时间AM/PM

新的数据时间API在Java8日的黎明引入。这是由于在旧的数据时间API中引起的问题。

难以处理时区:需要写很多代码来处理时区

不是线程安全的:java.util.日期不是线程安全的。

所以带着8Java四处看看

import java.time.LocalDate;import java.time.LocalTime;import java.time.LocalDateTime;import java.time.Month;

public class DataTimeChecker {
public static void main(String args[]) {DataTimeChecker dateTimeChecker = new DataTimeChecker();dateTimeChecker.DateTime();}
public void DateTime() {// Get the current date and timeLocalDateTime currentTime = LocalDateTime.now();System.out.println("Current DateTime: " + currentTime);
LocalDate date1 = currentTime.toLocalDate();System.out.println("Date : " + date1);
Month month = currentTime.getMonth();int day = currentTime.getDayOfMonth();int seconds = currentTime.getSecond();
System.out.println("Month : " + month);System.out.println("Day : " + day);System.out.println("Seconds : " + seconds);
LocalDateTime date2 = currentTime.withDayOfMonth(17).withYear(2018);System.out.println("Date : " + date2);
//Prints 17 May 2018LocalDate date3 = LocalDate.of(2018, Month.MAY, 17);System.out.println("Date : " + date3);
//Prints 04 hour 45 minutesLocalTime date4 = LocalTime.of(4, 45);System.out.println("Date : " + date4);
// Convert to a StringLocalTime date5 = LocalTime.parse("20:15:30");System.out.println("Date : " + date5);}}

上面代码的输出:

Current DateTime: 2018-05-17T04:40:34.603Date : 2018-05-17Month : MAYDay : 17Seconds : 34Date : 2018-05-17T04:40:34.603Date : 2018-05-17Date : 04:45Date : 20:15:30

我创造了这个方法,它对我有用…

public String GetDay() {return String.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("dd")));}
public String GetNameOfTheDay() {return String.valueOf(LocalDateTime.now().getDayOfWeek());}
public String GetMonth() {return String.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("MM")));}
public String GetNameOfTheMonth() {return String.valueOf(LocalDateTime.now().getMonth());}
public String GetYear() {return String.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy")));}
public boolean isLeapYear(long year) {return Year.isLeap(year);}
public String GetDate() {return GetDay() + "/" + GetMonth() + "/" + GetYear();}
public String Get12HHour() {return String.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("hh")));}
public String Get24HHour() {return String.valueOf(LocalDateTime.now().getHour());}
public String GetMinutes() {return String.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("mm")));}
public String GetSeconds() {return String.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("ss")));}
public String Get24HTime() {return Get24HHour() + ":" + GetMinutes();}
public String Get24HFullTime() {return Get24HHour() + ":" + GetMinutes() + ":" + GetSeconds();}
public String Get12HTime() {return Get12HHour() + ":" + GetMinutes();}
public String Get12HFullTime() {return Get12HHour() + ":" + GetMinutes() + ":" + GetSeconds();}

只需尝试此代码:

import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;public class CurrentTimeDateCalendar {public static void getCurrentTimeUsingDate() {Date date = new Date();String strDateFormat = "hh:mm:ss a";DateFormat dateFormat = new SimpleDateFormat(strDateFormat);String formattedDate= dateFormat.format(date);System.out.println("Current time of the day using Date - 12 hour format: " + formattedDate);}public static void getCurrentTimeUsingCalendar() {Calendar cal = Calendar.getInstance();Date date=cal.getTime();DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");String formattedDate=dateFormat.format(date);System.out.println("Current time of the day using Calendar - 24 hour format: "+ formattedDate);}}

其中示例输出为:

使用日期的当前时间-12小时格式:11:13:01 PM

使用日历的当前时间-24小时格式:23:13:01

更多信息:

获取当前日期时间在Java

Java8或以上

LocalDateTime.now() and ZonedDateTime.now()

使用Java 8的当前日期:首先,让我们使用java.time.LocalDate来获取当前系统日期:

LocalDate localDate = LocalDate.now();

要获取任何其他时区的日期,我们可以使用LocalDate.now(ZoneId):

LocalDate localDate = LocalDate.now(ZoneId.of("GMT+02:30"));

我们还可以使用java.time.LocalDateTime来获取LocalDate的实例:

LocalDateTime localDateTime = LocalDateTime.now();LocalDate localDate = localDateTime.toLocalDate();