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



Answers

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

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

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




如前所述,基本的Date()可以根据获取当前时间来做你所需要的。 在我最近使用Java日期的经验中,内置类有许多古怪(以及许多Date类方法的弃用)。 突出的一个奇怪之处在于,从技术角度来看,几个月的指数是基于0的,但实际上可能非常混乱。

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

我第二次提到斯蒂芬C的建议,因为我发现乔达时间对于简化我的日期工作非常有用,它也有很好的文档记录,你可以在整个网络中找到很多有用的例子。 我甚至最终编写了一个静态包装类(如DateUtils),用于整合和简化所有常见的日期操作。




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

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



使用:

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");
Calendar cal = Calendar.getInstance();
System.out.println(dateFormat.format(cal.getTime())); // 2014/08/06 16:00:22



    // 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() );



你可以自己使用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文档,它已经被deprecated

Oracle文档:

Date类表示特定时刻,具有毫秒精度。

在JDK 1.1之前,Date类有两个附加功能。 它允许将日期解释为年,月,日,小时,分钟和秒钟值。 它还允许格式化和分析日期字符串。 不幸的是,这些功能的API不适合国际化。 从JDK 1.1开始,应使用Calendar类在日期和时间字段之间进行转换,并使用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);

另外, 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 ,简单快捷地设置日期格式:

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

另请阅读:

。 现在最快乐的事情是(在java 8中),出于任何原因,没有人需要下载和使用库。 在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);

阅读Java 8日期好博客文章之一

并且要记住找出更多有关Java日期和时间的信息,因为有更多的方法和/或有用的方法可供您使用。

编辑:

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




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

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



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

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







Java 8中它是:

LocalDateTime.now()

如果您需要时区信息:

ZonedDateTime.now()

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

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





Related