将java.util.Date转换为String


407

我想将java.util.Date对象转换为StringJava。

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



@harschware仅供参考,Joda-Time项目现在处于维护模式,团队建议迁移到java.time类。请参见Oracle教程
罗勒·布尔克

1
我建议您不要使用,并且Date在2019年使用。该课程的设计很差,而且已经过时了。而是使用java.timeInstantJava现代的Java日期和时间API中的另一个类。
Ole VV

Answers:


757

转换日期字符串使用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


25
为什么使用Calendar而不是普通new Date()?有区别吗?
亚历山大·马拉霍夫

10
注意:SimpleDateFormat不是线程安全的。stackoverflow.com/questions/6840803/...
牛头犬

23
日历是抽象类,日期是具体的。Date不了解TimeZone,Locale或我们都从未使用过的任何好东西。
nckbrz 2014年

30
MM/dd/yyyy格式是愚蠢和破碎。不要使用它。始终使用dd/MM/yyyyyyyy-MM-dd
SystemParadox

13
@SystemParadox-这很愚蠢,但这并不是毫无意义的。我被特别要求使用它,因为它符合人们对报告的期望。(我希望yyyy-MM-dd在任何地方都可以,但是您能做什么?)。
2015年

223
Format formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = formatter.format(date);

63

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

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

需要额外null检查。
Farrukh Chishti

23

tl; dr

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.DateInstant。该Instant级表示时间轴上的时刻UTC,分辨率为纳秒(最多小数的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

看到该代码在IdeOne.com上实时运行

要获取所需格式的字符串,请指定DateTimeFormatter。您可以指定自定义格式。但是,我将使用预定义的格式器(ISO_LOCAL_DATE_TIME)之一,并T在其输出中将其替换为SPACE。

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

2014-11-14 14:05:09

顺便说一句,我不建议您故意丢失自UTC偏移量或时区信息的这种格式。创建有关该字符串的日期时间值含义的歧义。

还请注意数据丢失,因为在日期时间值的String表示中,任何小数秒都会被忽略(有效地被截断)。

要通过某个特定区域的挂钟时间的镜头看到同一时刻,请应用ZoneId来获取ZonedDateTime

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

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

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

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.Calendar,和java.text.SimpleDateFormat

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

要了解更多信息,请参见 Oracle教程。并在Stack Overflow中搜索许多示例和说明。

大部分的java.time功能后移植到Java 6和7 ThreeTen,反向移植,并进一步用于安卓ThreeTenABP(见如何使用?)。

ThreeTen-额外项目与其他类扩展java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。


以下是使用Java 8时间API进行格式化的代码示例:stackoverflow.com/a/43457343/603516
Vadzim

此代码不起作用OffsetDateTime odt = Instant.atOffset(ZoneOffset.UTC); odt.toString():2014-11-14T14:05:09 + 00:00是否有新的Java 8代码具有相同的格式2014-11-14T14:05:09 + 00:00?谢谢
Bob Bolden

@BobBolden您是正确的,默认Z使用而不是+00:00。我确定了答案,谢谢。仅供参考,它们的含义相同:Z读作“ Zulu”表示零时分分钟秒的偏移量,与相同+00:00。在ISO 8601标准支持两种风格。
罗勒·布尔克

@BasilBourque抱歉,目前还不清楚。我有Java 8,根本没有Instant.atOffset()。您能否建议Java 8的正确代码是什么,使其具有完全相同的格式2014-11-14T14:05:09 + 00:00而没有Instant.atOffset()?我有点迷失了:(
鲍勃·博尔登

@BobBolden的确存在atOffset的方法,Instant在Java中8见的Javadoc类: Instant::atOffset。在Java 8中,Instant.now().atOffset( ZoneOffset.UTC ).toString()将运行like这样的调用。检查您的import陈述。验证您的IDE /项目已设置为运行Java 8或更高版本,而不是运行Java的早期版本。请参见在IdeOne.com上实时运行的代码:ideone.com/2Vm2O5
Basil Bourque

19

普通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);

它使用格式化相关的索引,而不是SimpleDateFormat不是线程安全的,顺便说一句。

稍微重复一些,但只需要声明一下即可。在某些情况下,这可能很方便。


1
这是天才。在受限环境中的性能要好得多
Ruslan,

9

您为什么不使用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" ) )
罗勒·布尔克

7

看起来您在寻找SimpleDateFormat

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


“ kk”有什么特别之处吗?我认为Eric希望在24小时内完成。
查理·萨尔斯

2
是的,是一天中的小时(1-24),但这可能不是OP所需要的。HH(0-23)更常见。
BalusC

1
@Cahrlie Salts kk从1-24开始,而HH从0-23开始,假设他想要1-24 @BalusC DateFormat对象既解析又格式化,可能对我来说有点冒昧。
pickypg

我不明白您上一次评论的意义。我的评论是查理。
BalusC

我习惯于.Net格式,其中HH是24时间,hh是am / pm。因此,抓头。
查理·萨尔斯

5

单发;)

获取日期

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

快乐的编码:)


1
仅供参考,麻烦的旧日期,时间类,如java.util.Datejava.util.Calendarjava.text.SimpleDateFormat现在的遗产,由取代java.time内置到Java 8的Java 9.请参见类由Oracle教程
罗勒·布尔克

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

4

最简单的使用方法如下:

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日星期日

注意:HH vs hh-HH表示24h时间格式-hh表示12h时间格式


问题是相反的转换。
Vadzim '16

4

如果您只需要从日期开始的时间,则可以仅使用String功能。

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

这将自动减少String的时间部分并将其保存在中timeString


这可能会因不同的语言环境而中断。
Vadzim '16

4

以下是使用新的Java 8 Time API格式化旧版的 示例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)。

预定义格式列表和模式标记参考

学分:

如何使用LocalDateTime解析/格式化日期?(Java 8)

Java8将java.util.Date转换为java.time.ZonedDateTime

将Instant格式化为String

java 8 ZonedDateTime和OffsetDateTime有什么区别?


2

尝试这个,

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帮助中心

Java中的日期时间示例


1
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
}

1

让我们尝试一下

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

Java中的将日期转换为字符串


1
    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

1
Date date = new Date();
String strDate = String.format("%tY-%<tm-%<td %<tH:%<tM:%<tS", date);

1

一线选项

通过此选项,可以轻松地一行编写实际日期。

请注意,这是使用Calendar.classSimpleDateFormat,因此在Java8下使用它并不合逻辑。

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

1
仅供参考,非常麻烦的日期,时间类,如java.util.Datejava.util.Calendarjava.text.SimpleDateFormat现在的遗产,由取代java.time内置到Java 8和更高等级。请参见Oracle 教程
罗勒·布尔克

1
(1)答案是错误的(我刚好是2019-20-23 09:20:2220个月?)(2)我看不到答案提供了其他答案未涵盖的任何内容。(3)请不要教年轻人使用已经过时且臭名昭著的SimpleDateFormat课程。至少不是第一选择。也并非毫无保留。如今java.time,现代Java日期和时间API及其在方面有了很多改进DateTimeFormatter
Ole VV

是的。。我犯了一个错误,却忘了纠正它。我以快速的方式添加了它,不记得了..对不起!感谢您的意见家伙
亚历杭德罗·特谢拉·穆尼奥斯

@ OleV.V。并非每个人都可以使用现代Java数据和时间api ...所以...这个答案也很有效...
Alejandro TeixeiraMuñoz19年

1
谢谢你的评论。如果您想为Java 5或Java 6和7提供一个没有任何外部依赖关系的答案,那很好,那是值得欢迎的,仅请明确说明您正在做的事情。而且您的答案仍然是错误的,您将在新年前后得到惊喜。
Ole VV
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.