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

什么是获得当前date/时间的最佳方式?

这取决于你想要什么样的date/时间:

  • 如果你想把date/时间作为一个单一的数值,那么System.currentTimeMillis()会给你这个数字,表示为UNIX时代之后的毫秒数(如Java long )。 这个值是从UTC时间点开始的一个增量,并且与本地时区无关…假定系统时钟已经被正确设置。

  • 如果您希望在允许您以数字方式访问组件(年,月等)的窗体中显示date/时间,则可以使用以下任一项:

    • new Date()为您提供一个用当前date/时间初始化的Date对象。 问题是Date API方法大多是有缺陷的…并已弃用。

    • Calendar.getInstance()使用默认的LocaleTimeZone为您提供一个使用当前date/时间初始化的Calendar对象。 其他重载允许您使用特定的Locale和/或时TimeZone 。 日历工作…但API仍然繁琐。

    • new org.joda.time.DateTime()为您提供一个使用默认时区和年代表以当前date/时间初始化的Joda时间对象。 还有很多其他的Joda替代品…在这里描述太多了。

    • 在Java 8中,调用LocalDateTime.now()ZonedDateTime.now()将为您提供当前date/时间的表示forms。

在Java 8之前,大多数知道这些事情的人build议Joda时间 (迄今为止)拥有最好的Java API来处理涉及时间点和持续时间的计算。 对于Java 8,这不再是事实。 但是,如果您已经在您的代码库中使用了Joda时间,则没有强烈的迁移原因。


1 – 如果不这样做,您的代码不会中断,而且您也不会收到弃用警告。 当然,Joda代码库可能会停止获取更新,但不太可能需要它们。 没有更新意味着稳定,这是一件好事。

如果您只需输出格式为YYYY.MM.DD-HH.MM.SS的时间戳(非常常见的情况),那么可以这样做:

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

如果你想把当前的date作为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/

在Java 8中它是:

 LocalDateTime.now() 

如果您需要时区信息:

 ZonedDateTime.now() 

如果你想打印花哨的格式化的string:

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

只需创build一个Date对象…

 Date date = new Date(); 
  // 2015/09/27 15:07:53 System.out.println( new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(Calendar.getInstance().getTime()) ); // 15:07:53 System.out.println( new SimpleDateFormat("HH:mm:ss").format(Calendar.getInstance().getTime()) ); // 09/28/2015 System.out.println(new SimpleDateFormat("MM/dd/yyyy").format(Calendar.getInstance().getTime())); // 20150928_161823 System.out.println( new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime()) ); // Mon Sep 28 16:24:28 CEST 2015 System.out.println( Calendar.getInstance().getTime() ); // Mon Sep 28 16:24:51 CEST 2015 System.out.println( new Date(System.currentTimeMillis()) ); // Mon Sep 28 System.out.println( new Date().toString().substring(0, 10) ); // 2015-09-28 System.out.println( new java.sql.Date(System.currentTimeMillis()) ); // 14:32:26 Date 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.584 System.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 +0200 System.out.println( ZonedDateTime.now().format(DateTimeFormatter.RFC_1123_DATE_TIME) ); // 2015-09-28 System.out.println( LocalDate.now(ZoneId.of("Europe/Paris")) ); // rest zones id in ZoneId class // 16 System.out.println( LocalTime.now().getHour() ); // 2015-09-28T16:16:23.315 System.out.println( LocalDateTime.now() ); 

使用:

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

(这是工作。)

有许多不同的方法:

  • System.currentTimeMillis的()
  • date
  • 日历

创builddate的对象,并简单地打印下来。

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

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

类似于以上解决scheme。 但我总是发现自己在寻找这个代码块:

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

TL;博士

 Instant.now() 

… 要么 …

 ZonedDateTime.now( ZoneId.of( "America/Montreal" ) ) 

java.time

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

时区

另一个答案没有解释如何确定当前的date和时间的时区是至关重要的。 对于任何特定的时刻,date时间在全球范围内随区域而变化。 例如,午夜过后的几分钟是法国巴黎的新的一天,而在魁北克蒙特利尔仍然是“昨天”。

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 ZonedDateTime

 Instant instant = zdt.toInstant(); 

当您想要在时间轴上的实际时刻时,始终使用InstantZonedDateTime而不是LocalDateTimeLocal…types故意没有时区的概念,所以它们只代表一个可能的时刻的一个粗略的想法。 要获得实际的时刻,您必须指定一个时区,将Local…types转换为ZonedDateTime ,从而使其具有意义。

LocalDate

LocalDate类代表没有时间和没有时区的只有date的值。

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

string

要生成表示date时间值的string,只需在标准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类上search堆栈溢出的许多问题和解答。

避免LocalDateTime

与RamanSB对问题的评论相反,你不应该在当前的date时间使用LocalDateTime类。

LocalDateTime故意缺less任何时区或偏离UTC时间的信息。 所以,当你在时间轴上追踪特定时刻时,这是不合适的。 当然适合捕捉当前的时刻。

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


关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的遗留date时间类,如java.util.DateCalendarSimpleDateFormat

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

要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。 规范是JSR 310 。

从何处获取java.time类?

  • Java SE 8SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6SE 7
    • 大部分的java.timefunction都被移植到了ThreeTen-Backport中的 Java 6&7中。
  • Android的
    • ThreeTenABP项目专门针对Android,采用了ThreeTen-Backport (上文提到)。
    • 请参阅如何使用…。

ThreeTen-Extra项目将java.time扩展到其他类。 这个项目是未来可能增加java.time的一个试验场。 你可能会在这里find一些有用的类,比如IntervalYearWeekYearQuarter 等等 。

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

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

我觉得这是最好的方法:

 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 

1st了解java.util.Date类

1.1如何获取当前date

 import java.util.Date; class Demostration{ public static void main(String[]args){ Date date = new Date(); // date object System.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”并select所需的模式。 http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

2nd了解java.util.Calendar类

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和其他设置方法设置日历到不同的date。

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

看看Date类。 还有一个更新的Calendar类,它是进行多个date/时间操作的首选方法(Date中的很多方法已被弃用)。

如果您只想要当前date,则可以创build一个新的Date对象或调用Calendar.getInstance();

如前所述,基本的Date()可以根据获取当前时间来做你所需要的。 在我最近的Javadate工作经验中,有很多古怪的内置类(以及许多Date类方法的弃用)。 对我而言,一个奇怪的情况是,从技术的观点来看,几个月的指数是有意义的,但实际上可能是非常混乱的。

如果你只关心当前的date就足够了 – 但是如果你打算用date进行大量的操作/计算,那么使用第三方库可能是非常有利的(因为许多Java开发人员对于第三方库不是很满意内置的function)。

我第二次提到斯蒂芬·C的build议,因为我发现乔达时间在简化我的date工作方面非常有用,它也有很好的logging,你可以在整个networking中find许多有用的例子。 我甚至结束了写一个静态包装类(如DateUtils),我用它来巩固和简化所有的日常操作。

使用:

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

print语句将打印它被调用的时间,而不是在创buildSimpleDateFormat时。 所以可以反复调用,而不需要创build任何新的对象。

 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)); } } 

您可以使用date获取胎儿当前数据。 所以使用SimpleDateFormat获取格式

你可以自己使用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类表示特定的即时时间,毫秒精度。

在JDK 1.1之前,Date类有两个附加的function。 它允许将date解释为年,月,日,时,分和秒值。 它也允许格式化和分析datestring。 不幸的是,这些function的API不适合国际化。 从JDK 1.1开始,应使用Calendar类在date和时间字段之间进行转换,并使用DateFormat类来格式化和分析datestring。 Date中的相应方法已被弃用。

所以或者,你可以使用Calendar类,

 Calendar.YEAR; //and lot more 

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

 Calendar rightNow = Calendar.getInstance(); 

文档:

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

下面的代码获取date

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

此外, Calendar类有子类。 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 ,简单快捷地设置date格式:

 String pattern = "yyyy-MM-dd"; SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern); String date = simpleDateFormat.format(new Date()); System.out.println(date); 

阅读这个Jakob Jenkov教程:Java SimpleDateFormat 。

正如其他人提到的那样,当我们需要从date进行操作时,我们没有简单和最好的方法,或者我们不能满足于构build类,API。

作为一个例子,当我们需要在两个date之间得到不同的时候,当我们需要比较两个date(这里面还有内置的方法)等等。 我们不得不使用第三方库。 好时光是Joda Time。

另请阅读:

  • 如何在乔达时间适当地获得当前的date和时间?
  • JodaTime – 如何获得UTC的当前时间
  • JodaTime例子。
  • 下载Joda

。 现在最快乐的事情是(在Java 8中),没有人需要下载和使用库的任何原因。 在Java 8中获取当前date和时间的简单示例,

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

阅读Java 8date的好博客文章之一 。

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

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

编辑:

根据@BasilBourque的评论,诸如java.util.Datejava.util.Calendarjava.text.SimpleTextFormat类的麻烦的date时间类现在已经成为遗留的 ,被java.time类取代。

对于java.util.Date,只需创build一个新的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,使用Calendar.getInstance()

 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