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

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

评论

类似的问题:stackoverflow.com/questions/4772425/format-date-in-java

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

我建议您不要在2019年使用“日期”。该课程的设计欠佳,而且过时了。而是使用Instant或现代Java日期和时间API java.time中的另一个类。

#1 楼

使用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()?有区别吗?

–亚历山大·马拉霍夫(Alexander Malakhov)
13年8月19日在4:35

注意:SimpleDateFormat不是线程安全的。 stackoverflow.com/questions/6840803/…

–杂物
2014年1月17日,0:20



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

– nckbrz
2014年3月13日22:40在

MM / dd / yyyy格式很笨拙。不要使用它。始终使用dd / MM / yyyy或yyyy-MM-dd。

– SystemParadox
2015年9月23日下午12:53

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

–秋天伦纳德
2015年10月22日21:00

#2 楼

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


#3 楼

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

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


评论


需要额外的空检查。

– Farrukh Chishti
4月8日10:47

#4 楼

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.Date转换为InstantInstant类表示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上实时运行。

要获取所需格式的String,请指定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的偏移量或时区信息。在该字符串的日期时间值的含义上产生歧义。

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

要通过某个特定区域的壁钟时间通过镜头看到同一时刻,请应用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项目建议迁移到java.time。

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

java.time的许多功能都在ThreeTen-Backport中向后移植到Java 6和7,并在ThreeTenABP中进一步适用于Android(请参阅如何使用)。 …)。

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

评论


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

–Vadzim
17年4月17日在18:34

此代码不起作用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)
5月1日18:43



@BobBolden您是正确的,默认情况下使用Z代替+00:00。我确定了答案,谢谢。仅供参考,它们的含义相同:Z(发音为“ Zulu”)表示零时分分钟秒的偏移量,与+00:00相同。 ISO 8601标准支持两种样式。

–罗勒·布尔克
5月1日21:49

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

–鲍勃·鲍登(Bob Bolden)
5月2日,0:29



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

–罗勒·布尔克
5月2日,2:43



#5 楼

普通旧式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,它不是线程安全的,btw。

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

评论


这是天才。在受限环境下的性能要好得多

–俄罗斯
4月30日19:22



#6 楼

为什么不使用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对象。新的DateTime(currentDate,DateTimeZone.forID(“ America / Montreal”))

–罗勒·布尔克
2014年11月15日,0:17



#7 楼

看来您正在寻找SimpleDateFormat。

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

评论


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

–查理盐
2011年4月16日在1:03



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

– BalusC
2011年4月16日在1:04



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

–pickypg
2011年4月16日在1:06

我不明白您的最后评论的意义。我对查理的评论。

– BalusC
2011年4月16日在1:10



我习惯于.Net格式,其中HH是24时间,hh是am / pm。因此令人头疼。

–查理盐
2011年4月16日在1:22

#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.Date,java.util.Calendar和java.text.SimpleDateFormat)现在已被遗留,由Java 8和Java 9中内置的java.time类取代。由Oracle。

–罗勒·布尔克
18年2月4日在5:37

#9 楼

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


#10 楼

最简单的使用方法如下:

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年8月6日,下午3:06

#11 楼

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

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


这将自动剪切String的时间部分并将其保存在内部timeString

评论


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

–Vadzim
16年8月6日,下午3:06

#12 楼

以下是使用新的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?

#13 楼

试试这个,

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中的日期时间示例

#14 楼

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
}


#15 楼

让我们尝试一下

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中的将日期转换为字符串
/>

#16 楼

    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


#17 楼

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


#18 楼

“单行”选项

此选项使单行易于写出实际日期。


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


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


评论


仅供参考,现在麻烦的日期时间类(例如java.util.Date,java.util.Calendar和java.text.SimpleDateFormat)已成为旧版,由Java 8和更高版本中内置的java.time类取代。请参见Oracle教程。

–罗勒·布尔克
19年5月23日在2:58

(1)答案有误(我刚得到2019-20-23 09:20:22 —第20个月?)(2)我看不到答案提供了其他答案尚未涵盖的任何内容。 (3)请不要教年轻的孩子使用那些已经过时且臭名昭著的SimpleDateFormat类。至少不是第一选择。也并非毫无保留。今天,我们在java.time,现代Java日期和时间API及其DateTimeFormatter中有了更好的表现。

– Ole V.V.
19年5月23日在7:20

是的。。我犯了一个错误,却忘了纠正它。我以快速的方式添加了它,不记得了..对不起!谢谢你们的评论

–亚历杭德罗·特谢拉(Alejandro TeixeiraMuñoz)
19年5月23日在11:49

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

–亚历杭德罗·特谢拉(Alejandro TeixeiraMuñoz)
19年5月23日在11:50

谢谢你的评论。如果您想为Java 5或Java 6和7提供一个没有任何外部依赖性的答案,那很好,欢迎您,请明确说明您正在做的事情。而且您的答案仍然是错误的,您将在新年前后得到惊喜。

– Ole V.V.
19年5月23日在12:33