将 java.util.Date 转换为字符串

Posted

技术标签:

【中文标题】将 java.util.Date 转换为字符串【英文标题】:Convert java.util.Date to String 【发布时间】:2011-08-06 17:23:41 【问题描述】:

我想在 Java 中将 java.util.Date 对象转换为 String

格式为2010-05-30 22:15:52

【问题讨论】:

类似问题:***.com/questions/4772425/format-date-in-java @harschware 仅供参考,Joda-Time 项目现在位于maintenance mode,团队建议迁移到java.time 类。见Tutorial by Oracle。 我建议你不要在 2019 年使用和Date。该类设计糟糕且早已过时。而是使用Instant 或java.time, the modern Java date and time API 中的其他类。 【参考方案1】:

tl;博士

myUtilDate.toInstant()  // Convert `java.util.Date` to `Instant`.
          .atOffset( ZoneOffset.UTC )  // Transform `Instant` to `OffsetDateTime`.
          .format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )  // Generate a String.
          .replace( "T" , " " )  // Put a SPACE in the middle.

2014-11-14 14:05:09

java.time

现代方法是使用 java.time 类,它现在取代了麻烦的旧旧日期时间类。

首先将您的java.util.Date 转换为InstantInstant 类表示 UTC 时间线上的时刻,分辨率为 nanoseconds(最多九 (9) 位小数)。

与 java.time 的转换由添加到旧类的新方法执行。

Instant instant = myUtilDate.toInstant();

您的java.util.Datejava.time.Instant 都在UTC 中。如果您想将日期和时间视为 UTC,就这样吧。调用toString 生成标准ISO 8601 格式的字符串。

String output = instant.toString();  

2014-11-14T14:05:09Z

对于其他格式,您需要将Instant 转换为更灵活的OffsetDateTime

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

odt.toString(): 2020-05-01T21:25:35.957Z

看到code run live at IdeOne.com。

要获得所需格式的字符串,请指定DateTimeFormatter。您可以指定自定义格式。但我会使用其中一种预定义的格式化程序 (ISO_LOCAL_DATE_TIME),并将其输出中的 T 替换为空格。

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

2014-11-14 14:05:09

顺便说一句,我不推荐这种会故意丢失offset-from-UTC 或时区信息的格式。对该字符串的日期时间值的含义造成歧义。

还要注意数据丢失,因为在您的字符串表示日期时间值时,任何小数秒都会被忽略(有效截断)。

要通过某个特定地区的wall-clock time 的镜头看到同一时刻,请应用ZoneId 以获得ZonedDateTime

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

zdt.toString(): 2014-11-14T14:05:09-05:00[美国/蒙特利尔]

要生成格式化字符串,请执行与上述相同的操作,但将 odt 替换为 zdt

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

2014-11-14 14:05:09

如果多次执行此代码,您可能希望提高一点效率并避免调用String::replace。放弃该调用也会使您的代码更短。如果需要,请在您自己的 DateTimeFormatter 对象中指定您自己的格式化模式。将此实例缓存为常量或成员以供重用。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" );  // Data-loss: Dropping any fractional second.

通过传递实例应用该格式化程序。

String output = zdt.format( f );

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧日期时间类,例如 java.util.Date.Calendarjava.text.SimpleDateFormat

Joda-Time 项目现在位于 maintenance mode,建议迁移到 java.time。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。

大部分 java.time 功能在ThreeTen-Backport 中向后移植到Java 6 和7,并进一步适应ThreeTenABP 中的android(参见How to use…)。

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。

【讨论】:

以下是使用 Java 8 Time API 进行格式化的代码示例:***.com/a/43457343/603516 此代码不起作用 OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ); odt.toString(): 2014-11-14T14:05:09+00:00 是否有新的 Java 8 代码具有相同的格式 2014-11-14T14:05:09+00:00 ?谢谢 @BobBolden 你是对的,默认使用Z 而不是+00:00。我修复了答案,谢谢。仅供参考,它们的含义相同:Z,发音为“Zulu”表示零时分秒的偏移量,与+00:00 相同。 ISO 8601 标准支持这两种样式。 @BasilBourque 抱歉,这还不清楚。我有 Java 8,根本没有 instant.atOffset()。您能否建议 Java 8 的正确代码应该是什么,以便在没有 Instant.atOffset() 的情况下具有完全相同的格式 2014-11-14T14:05:09+00:00 ?我有点失落:( @BobBolden 在 Java 8 中的 Instant 类上确实有一个 atOffset 方法。请参阅 Javadoc:Instant::atOffset。在 Java 8 中,将运行像 Instant.now().atOffset( ZoneOffset.UTC ).toString() 这样的调用。检查您的 import 声明。验证您的 IDE/项目是否设置为运行 Java 8 或更高版本,而不是早期版本的 Java。查看在 IdeOne.com 上实时运行的代码:ideone.com/2Vm2O5【参考方案2】:

单线选项

这个选项可以简单地用一行来写实际日期。

请注意,这是使用Calendar.classSimpleDateFormat,然后不是 在 Java8 下使用它是合乎逻辑的。

yourstringdate =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());

【讨论】:

仅供参考,诸如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 等非常麻烦的日期时间类现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代.见Tutorial by Oracle。 (1) 答案是错误的(我刚得到2019-20-23 09:20:22 — 第 20 个月??) (2) 我看不出答案提供了其他答案中未涵盖的任何内容. (3)请不要教年轻人使用陈旧且臭名昭著的SimpleDateFormat类。至少不是第一选择。而且不是没有任何保留。今天我们在java.time, the modern Java date and time API, 和它的DateTimeFormatter 中做得更好。 是的....我做错了,忘记更正了。我很快就添加了它,但不记得了..对不起!感谢你们的 cmets 伙计们 @OleV.V.不是每个人都可以访问现代 Java 数据和时间 api......所以......这个答案也是有效的...... 感谢您的评论。如果您想为 Java 5 或 Java 6 和 7 提供没有任何外部依赖的答案,很好,欢迎您,请明确说明您正在做什么。而你的答案还是错的,新年前后你会得到惊喜。【参考方案3】:

使用DateFormat#format 方法将日期转换为字符串

String pattern = "MM/dd/yyyy HH:mm:ss";

// Create an instance of SimpleDateFormat used for formatting 
// the string representation of date according to the chosen pattern
DateFormat df = new SimpleDateFormat(pattern);

// Get the today date using Calendar object.
Date today = Calendar.getInstance().getTime();        
// Using DateFormat format method we can create a string 
// representation of a date with the defined format.
String todayAsString = df.format(today);

// Print the result!
System.out.println("Today is: " + todayAsString);

来自http://www.kodejava.org/examples/86.html

【讨论】:

为什么使用 Calendar 而不是普通的 new Date() ?有区别吗? 注意:SimpleDateFormat 不是线程安全的。 ***.com/questions/6840803/… Calendar 是一个抽象类,Date 是具体的。 Date 不知道 TimeZone、Locale 或任何我们都从未使用过的好东西。 MM/dd/yyyy 格式既愚蠢又损坏。不要使用它。始终使用dd/MM/yyyyyyyy-MM-dd @SystemParadox - 这很愚蠢,但这并不意味着它毫无意义。我被特别要求使用它,因为它符合人们对报告的期望。 (我更喜欢到处都是yyyy-MM-dd,但是你能做什么呢?)。【参考方案4】:
Date date = new Date();
String strDate = String.format("%tY-%<tm-%<td %<tH:%<tM:%<tS", date);

【讨论】:

【参考方案5】:

试试这个,

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Date

    public static void main(String[] args) 
    
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String strDate = "2013-05-14 17:07:21";
        try
        
           java.util.Date dt = sdf.parse(strDate);         
           System.out.println(sdf.format(dt));
        
        catch (ParseException pe)
        
            pe.printStackTrace();
        
    

输出:

2013-05-14 17:07:21

有关 java 中日期和时间格式的更多信息,请参阅下面的链接

Oracle Help Centre

Date time example in java

【讨论】:

【参考方案6】:

普通 Java 中的替代单行代码:

String.format("The date: %tY-%tm-%td", date, date, date);

String.format("The date: %1$tY-%1$tm-%1$td", date);

String.format("Time with tz: %tY-%<tm-%<td %<tH:%<tM:%<tS.%<tL%<tz", date);

String.format("The date and time in ISO format: %tF %<tT", date);

这使用Formatter 和relative indexing 而不是SimpleDateFormat,即not thread-safe,顺便说一句。

稍微重复但只需要一个语句。 这在某些情况下可能很方便。

【讨论】:

这是天才。为受限环境提供更好的性能【参考方案7】:
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String date = "2010-05-30 22:15:52";
    java.util.Date formatedDate = sdf.parse(date); // returns a String when it is parsed
    System.out.println(sdf.format(formatedDate)); // the use of format function returns a String

【讨论】:

【参考方案8】:

单发;)

获取日期

String date = new SimpleDateFormat("yyyy-MM-dd",   Locale.getDefault()).format(new Date());

获得时间

String time = new SimpleDateFormat("hh:mm", Locale.getDefault()).format(new Date());

获取日期和时间

String dateTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.getDefaut()).format(new Date());

编码愉快:)

【讨论】:

仅供参考,麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 和 Java 中内置的 java.time 类所取代9. 见Tutorial by Oracle。【参考方案9】:

以下是使用新Java 8 Time API 格式化legacy java.util.Date 的示例:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS Z")
        .withZone(ZoneOffset.UTC);
    String utcFormatted = formatter.format(date.toInstant()); 

    ZonedDateTime utcDatetime = date.toInstant().atZone(ZoneOffset.UTC);
    String utcFormatted2 = utcDatetime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS Z"));
    // gives the same as above

    ZonedDateTime localDatetime = date.toInstant().atZone(ZoneId.systemDefault());
    String localFormatted = localDatetime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
    // 2011-12-03T10:15:30+01:00[Europe/Paris]

    String nowFormatted = LocalDateTime.now().toString(); // 2007-12-03T10:15:30.123

DateTimeFormatter 很好,因为它是线程安全的(与 SimpleDateFormat 不同),因此可以有效地缓存。

List of predefined fomatters and pattern notation reference.

学分:

How to parse/format dates with LocalDateTime? (Java 8)

Java8 java.util.Date conversion to java.time.ZonedDateTime

Format Instant to String

What's the difference between java 8 ZonedDateTime and OffsetDateTime?

【讨论】:

【参考方案10】:

让我们试试这个

public static void main(String args[]) 

    Calendar cal = GregorianCalendar.getInstance();
    Date today = cal.getTime();
    DateFormat df7 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    try            
        String str7 = df7.format(today);
        System.out.println("String in yyyy-MM-dd format is: " + str7);          
     catch (Exception ex) 
      ex.printStackTrace();
    

或者一个效用函数

public String convertDateToString(Date date, String format) 
    String dateStr = null;
    DateFormat df = new SimpleDateFormat(format);

    try 
        dateStr = df.format(date);
     catch (Exception ex) 
        ex.printStackTrace();
    
    return dateStr;

来自Convert Date to String in Java

【讨论】:

【参考方案11】:

如果你只需要日期的时间,你可以使用字符串的特性。

Date test = new Date();
String dayString = test.toString();
String timeString = dayString.substring( 11 , 19 );

这将自动切割字符串的时间部分并将其保存在timeString中。

【讨论】:

这可能会因不同的语言环境而中断。【参考方案12】:

最简单的使用方法如下:

currentISODate = new Date().parse("yyyy-MM-dd'T'HH:mm:ss", "2013-04-14T16:11:48.000");

其中“yyyy-MM-dd'T'HH:mm:ss”是阅读日期的格式

输出:2013 年 4 月 14 日星期日 16:11:48 EEST

注意事项:HH 与 hh - HH 指 24 小时制时间格式 - hh 表示 12h 时间格式

【讨论】:

问题是关于反向转换。【参考方案13】:
public static void main(String[] args) 

    Date d = new Date();
    SimpleDateFormat form = new SimpleDateFormat("dd-mm-yyyy hh:mm:ss");
    System.out.println(form.format(d));
    String str = form.format(d); // or if you want to save it in String str
    System.out.println(str); // and print after that

【讨论】:

【参考方案14】:

为什么不使用 Joda (org.joda.time.DateTime)? 它基本上是单行的。

Date currentDate = GregorianCalendar.getInstance().getTime();
String output = new DateTime( currentDate ).toString("yyyy-MM-dd HH:mm:ss");

// output: 2014-11-14 14:05:09

【讨论】:

我建议也传递一个 DateTimeZone,而不是将 JVM 当前的默认时区分配给 DateTime 对象。 new DateTime( currentDate , DateTimeZone.forID( "America/Montreal" ) )【参考方案15】:
public static String formateDate(String dateString) 
    Date date;
    String formattedDate = "";
    try 
        date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss",Locale.getDefault()).parse(dateString);
        formattedDate = new SimpleDateFormat("dd/MM/yyyy",Locale.getDefault()).format(date);
     catch (ParseException e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    

    return formattedDate;

【讨论】:

【参考方案16】:

Commons-lang DateFormatUtils 充满了好东西(如果你的类路径中有 commons-lang)

//Formats a date/time into a specific pattern
 DateFormatUtils.format(yourDate, "yyyy-MM-dd HH:mm:SS");

【讨论】:

需要额外的null 检查。【参考方案17】:
Format formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = formatter.format(date);

【讨论】:

来这里复制和粘贴,这个答案可以节省我的时间,谢谢和支持。【参考方案18】:

您似乎正在寻找SimpleDateFormat。

格式:yyyy-MM-dd kk:mm:ss

【讨论】:

“kk”有什么特别之处吗?我认为 Eric 想要在 24 小时内完成。 是的,一天中的小时 (1-24),但这可能不是 OP 需要的。 HH (0-23) 比较常见。 @Cahrlie Salts kk 从 1-24 开始,而 HH 从 0-23 开始,我可能有点冒昧地假设他想要 1-24 @BalusC DateFormat 对象同时解析和格式。 我不明白您上一条评论的相关性。我的评论是给查理的。 我习惯了 .Net 格式,其中 HH 是 24 时间,hh 是上午/下午。因此令人头疼。

以上是关于将 java.util.Date 转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GMT(格林威治)时间将 XMLGregorianCalendar 转换为 java.util.Date

尝试将数据插入数据库表时,java.util.Date 无法转换为 java.sql.Date [关闭]

java.util.Date 不能转换为 java.sql.Date [重复]

java.util.Date和java.sql.Date的区别及应用

无法将 java.lang.String 类型的属性值转换为所需的 java.util.Date 类型

如何正确地转换成 java.util.Date 通过 JPA 的 Oracle 日期字段