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

use*_*949 661 java datetime

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

Ste*_*n C 631

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

  • 如果您希望将日期/时间作为单个数值,System.currentTimeMillis()则为您提供,表示为UNIX纪元(作为Java long)之后的毫秒数.此值是UTC时间点的增量,并且与本地时区无关...假设系统时钟已正确设置.

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

    • new Date()为您提供一个Date使用当前日期/时间初始化的对象.问题是DateAPI方法大多存在缺陷......并且已弃用.

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

    • new org.joda.time.DateTime()使用默认时区和年表,为您提供使用当前日期/时间初始化的Joda-time对象.还有很多其他的Joda替代品......这里描述的太多了.(但请注意,有些人报告说Joda时间有性能问题.例如,Jodatime的LocalDateTime在第一次使用时速度很慢.)

    • 在Java中8,呼吁LocalDateTime.now()ZonedDateTime.now()会给你申述1当前日期/时间.

在Java 8之前,大多数了解这些事情的人都建议Joda-time拥有(到目前为止)用于处理涉及时间点和持续时间计算的最佳Java API.使用Java 8,这已不再适用.但是,如果您已经在代码库中使用Joda时间,则没有强大的2个迁移原因.


1 - 请注意,LocalDateTime不包含时区.正如javadoc所说:"它不能代表时间线上的瞬间,没有附加信息,如偏移或时区."

2 - 如果不这样做,您的代码将不会中断,并且您不会收到弃用警告.当然,Joda代码库可能会停止获取更新,但它不太可能需要它们.没有更新意味着稳定性,这是一个很好的事情.另请注意,如果有人能够解决Java平台中的回归导致的问题,那很有可能.

  • @Geek - `System.currentTimeMillis()`值大约是UTC,本地UTC时钟和真实UTC之间可能存在差异(delta).`System.currentTimeMillis()`独立于本地时区......好吧......因为它是UTC,无论计算机,用户或其他任何东西的本地时区如何,UTC都是相同的. (4认同)
  • @StephenC _"但是,如果你已经在你的代码库中使用Joda时间,那么没有强有力的理由进行迁移."_我不同意,Joda背后的人也没有,正如主页引用的那样:_ "请注意,从Java SE 8开始,用户被要求迁移到java.time(JSR-310) - 这是JDK的核心部分,它取代了这个项目."_很可能,Joda的时间不会进一步发展,因此可以视为已弃用.通过迁移到JSR-310,将来可以更轻松地开始使用API​​中的新功能.否则,好的答案. (3认同)
  • @Magnilex - 我不同意这是一个强有力的理由.使用Joda时间的代码将继续无限期地工作.**强**原因是当您需要更改代码时,因为它已损坏或很快变得无法维护(由于依赖冲突,供应商关闭商店等). (2认同)

Lie*_*rad 394

如果您只需要输出YYYY.MM.DD-HH.MM.SS格式的时间戳(非常频繁的情况),那么这就是这样做的方法:

String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());
Run Code Online (Sandbox Code Playgroud)

  • 应该稍微更快(在运行时)使用静态最终DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); (6认同)
  • 这是获得时间戳的最快,最短的解决方案! (4认同)
  • `SimpleDateFormat`是旧的并且有_lally bad_并发问题(你不怀疑它与并发有什么关系,但http://stackoverflow.com/questions/6840803),请使用Java 8 http://stackoverflow.com /一个/513342分之26225884 (3认同)
  • 仅供参考,麻烦的旧日期时间类,例如 [`java.util.Date`](https://docs.oracle.com/javase/9​​/docs/api/java/util/Date.html)、[` java.util.Calendar`](https://docs.oracle.com/javase/9​​/docs/api/java/util/Calendar.html) 和 `java.text.SimpleDateFormat` 现在是[旧版](https ://en.wikipedia.org/wiki/Legacy_system),由 [*java.time*](https://docs.oracle.com/javase/9​​/docs/api/java/time/package-summary .html)Java 8 及更高版本中内置的类。请参阅 Oracle 的 [*教程*](https://docs.oracle.com/javase/tutorial/datetime/TOC.html)。 (2认同)
  • 这也是您应该将应用程序更新到 Java 8 或更高版本的另一个原因。但如果你不能,你*可以*使用 Joda 时间库而不是遗留类。 (2认同)

dug*_*ggu 101

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

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

要么

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

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


Ole*_*eev 71

Java 8中它是:

LocalDateTime.now()
Run Code Online (Sandbox Code Playgroud)

如果您需要时区信息:

ZonedDateTime.now()
Run Code Online (Sandbox Code Playgroud)

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

System.out.println(ZonedDateTime.now().format(DateTimeFormatter.RFC_1123_DATE_TIME))
Run Code Online (Sandbox Code Playgroud)

  • 太好了-我只需要时间:LocalDateTime.now()。format(DateTimeFormatter.ISO_LOCAL_TIME) (2认同)

Ami*_*ani 45

只需创建一个Date对象......

Date date = new Date();
Run Code Online (Sandbox Code Playgroud)

  • 空构造函数不被弃用,是吗?http://docs.oracle.com/javase/7/docs/api/java/util/Date.html#Date() (16认同)
  • Date()分配Date对象并对其进行初始化,使其表示分配时间,测量精确到毫秒. (4认同)
  • 从Java 8开始,java.util.Date类和那个构造函数都没有被正式弃用.它的许多方法都是,但不是全部.但是,还有其他原因可以避免使用此类和.Calendar类.现在由Java 8中的新java.time包取代. (3认同)

Bas*_*que 44

TL;博士

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

… 要么 …

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.
Run Code Online (Sandbox Code Playgroud)

java.time

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

时区

其他答案无法解释时区对于确定当前日期和时间至关重要.对于任何给定的时刻,日期时间在全球范围内因地区而异.例如,午夜过后几分钟是巴黎法国新的一天,而在魁北克蒙特利尔仍然是"昨天" .

Instant

作为最佳实践,您的大部分业务逻辑和数据存储/交换应以UTC格式完成.要以UTC为单位以分辨率(以纳秒为单位)获取当前时刻,请使用Instantclass.

Instant instant = Instant.now();
Run Code Online (Sandbox Code Playgroud)

ZonedDateTime

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

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
Run Code Online (Sandbox Code Playgroud)

我们可以跳过InstantZonedDateTime直接获取当前信息.

ZonedDateTime zdt = ZonedDateTime.now( z );
Run Code Online (Sandbox Code Playgroud)

始终传递可选的时区参数.如果省略,则应用JVM的当前默认时区.默认可以改变任何,甚至时刻,运行时.不要让您的应用受到外部因素的影响.始终指定所需/预期的时区.

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

您可以稍后提取InstantZonedDateTime.

Instant instant = zdt.toInstant();
Run Code Online (Sandbox Code Playgroud)

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

LocalDate

LocalDate级表示没有时间一天和不同时区的日期,唯一的价值.

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

字符串

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

String output = myLocalDate.toString();  // 2016-09-23
Run Code Online (Sandbox Code Playgroud)

… 要么 …

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

ZonedDateTime班通过明智地附加在方括号中的时区的名称,扩展了标准格式.

对于其他格式,请在DateTimeFormatter课堂上搜索Stack Overflow以获取许多问题和答案.

避免 LocalDateTime

相反,由RamanSB问题的评论,你应该使用LocalDateTime类的当前日期与时间.

LocalDateTime故意没有任何时区或偏移从-UTC的信息.那么,这是不是当您在跟踪的时间轴上一个特定的时刻合适.当然适合捕捉当前时刻.

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


从您的系统外部

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

几个外部无线电时钟设备的照片

ZonedDateTime

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

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

Instant instant = Instant.now( yourClockGoesHere ) ;
Run Code Online (Sandbox Code Playgroud)

出于测试目的,注意的可选的实施方式Instant.now( clock )从现有的静态Clock本身:Clock,fixed,offset,和更多.


关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如tick,java.util.Date,和Calendar.

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

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

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

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类java.sql.*,Interval,YearWeek,和更多.

  • 这也许是关于java date-time..lawless的最佳答案之一! (2认同)

blu*_*xff 41

    // 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() );
Run Code Online (Sandbox Code Playgroud)


小智 18

使用:

String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());
System.out.println(timeStamp );
Run Code Online (Sandbox Code Playgroud)

(它正在工作.)


Gre*_*ill 15

有许多不同的方法:

  • 如何从 System.currentTimeMillis() 方法获取准确的日期? (2认同)

Sub*_*odh 10

创建日期对象,然后将其打印下来.

Date d = new Date(System.currentTimeMillis());
System.out.print(d);
Run Code Online (Sandbox Code Playgroud)


Jef*_*Jak 9

与上述解决方案类似.但我总是发现自己正在寻找这段代码:

Date date=Calendar.getInstance().getTime();
System.out.println(date);
Run Code Online (Sandbox Code Playgroud)


Sta*_*key 8

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

  • 我喜欢他们被淘汰了13年和6个版本,但他们仍然在那里. (14认同)
  • 不,我理解_why_它还在,我认为它很有趣.弃用应该产生最终的删除,不是因为库的大小,而是因为它被弃用了一个原因:使用它是个坏主意.这是我的意见,这绝对是一个棘手的话题. (9认同)
  • 一些方法已被弃用,但是没有参数构造函数不是,它就是你想要的. (3认同)
  • 是的,为了向后兼容性而使用一些弃用的方法有什么危害?一个最小的标准库?我想我们可以忍受这一点. (2认同)

Rud*_*udy 8

java.util.Date date = new java.util.Date();
Run Code Online (Sandbox Code Playgroud)

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


小智 7

1st了解java.util.Date类

1.1如何获取当前日期

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这将返回自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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

2nd了解java.util.Calendar类

2.1使用Calendar Class获取当前时间戳

import java.util.Calendar;

class Demostration{
    public static void main(String[]args){
        Calendar calendar=Calendar.getInstance();
        System.out.println(calendar.getTime());
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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


ami*_*dya 7

对于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
Run Code Online (Sandbox Code Playgroud)

对于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
Run Code Online (Sandbox Code Playgroud)

对于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
Run Code Online (Sandbox Code Playgroud)

对于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
Run Code Online (Sandbox Code Playgroud)

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


小智 7

Java 8 或以上

LocalDateTime.now() and ZonedDateTime.now()
Run Code Online (Sandbox Code Playgroud)


kel*_*a88 6

我觉得这是最好的方法:

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
Run Code Online (Sandbox Code Playgroud)


Mic*_*rry 5

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

如果您只需要当前日期,则创建一个新的 Date 对象或调用Calendar.getInstance();.


归档时间:

查看次数:

1637957 次

最近记录:

5 年,10 月 前