想要以“dd/MM/yyyy HH:mm:ss.SS”格式获取当前日期和时间。

26
我正在使用以下代码以“dd/MM/yyyy HH:mm:ss.SS”格式获取日期。
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateAndTime{

    public static void main(String[] args) throws Exception{
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss.SS");
        String strDate = sdf.format(cal.getTime());
        System.out.println("Current date in String Format: "+strDate);

        SimpleDateFormat sdf1 = new SimpleDateFormat();
        sdf1.applyPattern("dd/MM/yyyy HH:mm:ss.SS");
        Date date = sdf1.parse(strDate);
        System.out.println("Current date in Date Format: "+date);
    }
}

我得到了以下输出

Current date in String Format: 05/01/2012 21:10:17.287
Current date in Date Format: Thu Jan 05 21:10:17 IST 2012

请建议我应该怎么做才能以相同的字符串格式(dd/MM/yyyy HH:mm:ss.SS)显示日期,即我想要以下输出:
Current date in String Format: 05/01/2012 21:10:17.287
Current date in Date Format: 05/01/2012 21:10:17.287

2
当您使用System.out.println打印日期对象时,将调用Date的toString方法。您需要创建自己的Date子类并覆盖toString方法以按您想要的方式输出日期。 - Robert M.
1
很不清楚你想要什么,但是要明白这一点:Date.toString() 返回默认格式,无法更改。您需要使用 SimpleDateFormat 来格式化字符串输出。 - Viruzzo
你是指毫秒的.SSS吗?Java不支持1/100秒。如果你使用.SS,它可能不会按照你的预期行事。 - Peter Lawrey
2
请注意,像java.util.Datejava.util.Calendarjava.text.SimpleDateFormat这样的旧日期时间类现在已经成为遗留系统,被内置于Java 8及更高版本中的java.time类所取代。请参阅Oracle的教程 - Basil Bourque
11个回答

19

SimpleDateFormat

sdf=new SimpleDateFormat("dd/MM/YYYY hh:mm:ss");
String dateString=sdf.format(date);

它将按您的期望输出28/09/2013 09:57:19

点击此处获取完整程序


java.util.Date temp = new SimpleDateFormat("dd/mm/yyyy hh:mm:ss", Locale.US).parse(ackDateTimeString); 最终对我起作用了! - AnhSirk Dasarp
请注意,像java.util.Datejava.util.Calendarjava.text.SimpleDateFormat这样的旧日期时间类现在已经成为遗留系统,被内置于Java 8及更高版本中的java.time类所取代。请参阅Oracle的教程 - Basil Bourque

15

你不能这样做 - 因为你正在调用 Date.toString() ,如果系统默认的日期格式和默认的语言环境中包含系统时区,这将始终包含系统时区。 Date 值本身没有格式概念。 如果您想以特定方式格式化它,请使用 SimpleDateFormat.format()... 使用 Date.toString() 几乎总是不明智的。


12

以下代码给出了预期的输出。这是否是您想要的结果?

import java.util.Calendar;
import java.util.Date;

public class DateAndTime {

    public static void main(String[] args) throws Exception {
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss.SS");
        String strDate = sdf.format(cal.getTime());
        System.out.println("Current date in String Format: " + strDate);

        SimpleDateFormat sdf1 = new SimpleDateFormat();
        sdf1.applyPattern("dd/MM/yyyy HH:mm:ss.SS");
        Date date = sdf1.parse(strDate);
        String string = sdf1.format(date);
        System.out.println("Current date in Date Format: " + string);

    }
}

4

简述

  • 使用现代化的 java.time 类。
  • 永远不要使用 Date/Calendar/SimpleDateFormat 类。

示例:

ZonedDateTime                                // Represent a moment as seen in the wall-clock time used by the people of a particular region (a time zone).
.now(                                        // Capture the current moment.
    ZoneId.of( "Africa/Tunis" )              // Always specify time zone using proper `Continent/Region` format. Never use 3-4 letter pseudo-zones such as EST, PDT, IST, etc.
)
.truncatedTo(                                // Lop off finer part of this value.
    ChronoUnit.MILLIS                        // Specify level of truncation via `ChronoUnit` enum object.
)                                            // Returns another separate `ZonedDateTime` object, per immutable objects pattern, rather than alter (“mutate”) the original.
.format(                                     // Generate a `String` object with text representing the value of our `ZonedDateTime` object.
    DateTimeFormatter.ISO_LOCAL_DATE_TIME    // This standard ISO 8601 format is close to your desired output.
)                                            // Returns a `String`.
.replace( "T" , " " )                        // Replace `T` in middle with a SPACE.

java.time

现代方法使用java.time类,这些类多年前替代了可怕的旧日期时间类,例如CalendarSimpleDateFormat

想要当前日期和时间

使用Instant在UTC中捕获当前时刻。
Instant instant = Instant.now() ;

要以某个特定地区(时区)使用的挂钟时间来查看同一时刻,可以应用ZoneId获取ZonedDateTime
continent/region格式指定适当的时区名称,例如America/MontrealAfrica/CasablancaPacific/Auckland。永远不要使用3-4个字母的缩写,如ESTIST,因为它们不是真正的时区,不被标准化,甚至不是唯一的!
ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

或者,作为一种快捷方式,将ZoneId传递给ZonedDateTime.now方法。

ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "Pacific/Auckland" ) ) ;

java.time 类使用纳秒为分辨率。这意味着可以显示到小数点后九位的秒。如果您只需要三位,即毫秒,请截断。将您所需的限制作为 ChronoUnit 枚举对象传递。

ZonedDateTime
.now( 
    ZoneId.of( "Pacific/Auckland" ) 
)
.truncatedTo(
    ChronoUnit.MILLIS
)

以“dd/MM/yyyy HH:mm:ss.SS”格式

我建议在生成字符串时始终包括UTC偏移量或时区,以避免歧义和误解。

但如果您坚持,可以在生成表示日期时间值的字符串时指定特定格式。一个内置的预定义格式器几乎满足您所需的格式,但对于您想要空格的T,需要进行修改。

String output = 
    zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
    .replace( "T" , " " )  
;

sdf1.applyPattern("dd/MM/yyyy HH:mm:ss.SS");

Date date = sdf1.parse(strDate);

不要使用用于向人类展示的文本交换日期时间值。

相反,使用专门为此目的定义的标准格式,可在ISO 8601中找到。

java.time在解析/生成字符串时默认使用这些ISO 8601格式。

在交换特定时刻时,始终包括UTC偏移量或时区指示器。因此,应避免使用上述所讨论的期望格式进行数据交换。此外,通常最好将时刻作为UTC交换。这意味着在java.time中是一个Instant。您可以从ZonedDateTime交换Instant,有效地将时区调整为UTC以获得相同的时刻、时间线上的相同点,但具有不同的挂钟时间。

Instant instant = zdt.toInstant() ;
String exchangeThisString = instant.toString() ;

2018-01-23T01:23:45.123456789Z

这个ISO 8601格式在结尾使用Z代表协调世界时,发音为“Zulu”。

关于java.time

Java.time框架内置于Java 8及以上版本。这些类替代了老旧的遗留日期时间类,如java.util.Date, Calendar, & SimpleDateFormat

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

了解更多信息,请参阅Oracle教程。并在Stack Overflow上搜索许多示例和说明。规范为JSR 310

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

如何获取java.time类?

ThreeTen-Extra项目扩展了java.time的额外类。该项目是java.time可能未来添加的试验场。您可能会在这里找到一些有用的类,例如Interval, YearWeek, YearQuarter更多


3
你需要使用 SimpleDateFormat 将日期格式化为你所需的格式。
System.out.println("Current date in Date Format: " + sdf.format(date));

2023年更新:正如其他答案所指出的那样,现在的代码应该默认使用Java日期和时间API,其中包括SimpleDateFormat的现代、不可变和线程安全的姊妹类:DateTimeFormatter


3

这是一个简单的代码片段,适用于Java 8,并使用“新”的日期和时间API LocalDateTime:

Original Answer翻译成"最初的回答"

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss.SS");
LocalDateTime now = LocalDateTime.now();
System.out.println(dtf.format(now)); 

1

你第一个printline的输出是使用了你的格式化程序。你第二个printline(从解析字符串创建的日期)的输出是使用Date#toString输出的,它根据自己的规则进行格式化。也就是说,你没有使用格式化程序。

规则如下,就像你所看到的并在这里描述的一样: http://docs.oracle.com/javase/6/docs/api/java/util/Date.html#toString()


0

免责声明:本答案支持使用Date类(实际上它已经过时且设计不佳,因此我完全不鼓励使用)。我试图回答一个关于日期和时间对象格式的常见问题。为此,我使用Date类作为示例。其他类在最后处理。

你不想要

你不需要一个特定格式的Date。在除了最简单的一次性程序之外的所有情况下,良好的实践是将用户界面与模型和业务逻辑分开。 Date对象的值属于您的模型,因此请将Date保留在那里,永远不要让用户直接看到它。当您遵循此原则时,Date的格式将永远无关紧要。每当用户需要查看日期时,请将其格式化为String并向用户显示该字符串。同样,如果您需要特定格式以进行持久化或与另一个系统交换,请将Date格式化为该目的的字符串。如果用户需要输入日期和/或时间,请接受字符串或使用日期选择器或时间选择器。

特殊情况:存储到SQL数据库中。你的数据库可能需要特定的格式,但实际上不需要。使用yourPreparedStatement.setObject(yourParamIndex, yourDateOrTimeObject),其中yourDateOrTimeObjectLocalDateInstantLocalDateTime或来自java.time的适当日期时间类的实例。再次强调,不必担心该对象的格式。搜索更多详细信息。

你不能

Date没有格式,也不能有格式。它只是一个时间点,仅此而已。它是一个值的容器。在你的代码中,sdf1.parse将你的字符串转换为Date对象,即一个时间点。它不保留字符串或字符串中的格式。
最后,让我们看一下你代码中的下一行:
    System.out.println("Current date in Date Format: "+date);

为了执行由Java中的“+”符号所需的字符串连接,需要将您的Date转换为String。它通过调用Date对象的toString方法来实现这一点。Date.toString总是生成像Thu Jan 05 21:10:17 IST 2012这样的字符串。您无法更改它(除非在Date的子类中,但您不想这样做)。然后将生成的字符串与字符串文字连接起来,以产生由System.out.println打印的字符串。

简而言之,“格式”仅适用于日期的字符串表示形式,而不适用于日期本身。

一个Date没有格式,这不奇怪吗?

我认为我写的很符合预期。它类似于其他类型。想象一下一个int。同样的int可以格式化为诸如53,55153.551(千位分隔符使用点),00053551+53 551甚至0x0000_D12F等字符串。所有这些格式化都会产生字符串,而int保持不变,不改变其格式。对于Date对象也是完全相同的:您可以将其格式化为多种不同的字符串,但Date本身始终保持不变。

然后,我能以我选择的格式获得LocalDate、ZonedDateTime、Calendar、GregorianCalendar、XMLGregorianCalendar、java.sql.Date、Time或Timestamp吗?

不,您不能,原因与上述相同。事实上,我所遇到的任何日期或时间类别,包括提到的任何类别,都不能具有格式。您只能在您的日期时间对象之外的String中拥有您想要的格式。

链接


0
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateAndTime{

  public static void main(String[] args)throws Exception{
     Date date = new Date(System.currentTimeMillis());
     DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss.SS", 
      Locale.ENGLISH);
    String strDate = format.format(date);
    System.out.println("Current date in String Format: "+strDate);
   }
}

使用此代码,您将以所期望的字符串格式获取当前日期


0
如果您正在使用JAVA8 API,那么这段代码将会有所帮助。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String dateTimeString = LocalDateTime.now().format(formatter);
System.out.println(dateTimeString);

它将以给定格式打印日期。

但如果您再次创建LocalDateTime对象,则会在日期和时间之间打印“T”。

LocalDateTime dateTime = LocalDateTime.parse(dateTimeString, formatter);
System.out.println(dateTime.toString());

在之前的帖子中也提到过,表示和使用是不同的。
最好使用"yyyy-MM-dd'T'HH:mm:ss"格式,并相应地转换字符串/日期对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接