如何在Java中获取当前date/时间
什么是获得当前date/时间的最佳方式?
这取决于你想要什么样的date/时间:
-
如果你想把date/时间作为一个单一的数值,那么
System.currentTimeMillis()
会给你这个数字,表示为UNIX时代之后的毫秒数(如Javalong
)。 这个值是从UTC时间点开始的一个增量,并且与本地时区无关…假定系统时钟已经被正确设置。 -
如果您希望在允许您以数字方式访问组件(年,月等)的窗体中显示date/时间,则可以使用以下任一项:
-
new Date()
为您提供一个用当前date/时间初始化的Date
对象。 问题是Date
API方法大多是有缺陷的…并已弃用。 -
Calendar.getInstance()
使用默认的Locale
和TimeZone
为您提供一个使用当前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();
当您想要在时间轴上的实际时刻时,始终使用Instant
或ZonedDateTime
而不是LocalDateTime
。 Local…
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.Date
, Calendar
和SimpleDateFormat
。
Joda-Time项目现在处于维护模式 ,build议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。 规范是JSR 310 。
从何处获取java.time类?
- Java SE 8和SE 9及更高版本
- 内置。
- 带有捆绑实现的标准Java API的一部分。
- Java 9增加了一些小function和修复。
- Java SE 6和SE 7
- 大部分的java.timefunction都被移植到了ThreeTen-Backport中的 Java 6&7中。
- Android的
- ThreeTenABP项目专门针对Android,采用了ThreeTen-Backport (上文提到)。
- 请参阅如何使用…。
ThreeTen-Extra项目将java.time扩展到其他类。 这个项目是未来可能增加java.time的一个试验场。 你可能会在这里find一些有用的类,比如Interval
, YearWeek
, YearQuarter
等等 。
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.Date
, java.util.Calendar
和java.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