将 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
转换为Instant
。 Instant
类表示 UTC 时间线上的时刻,分辨率为 nanoseconds(最多九 (9) 位小数)。
与 java.time 的转换由添加到旧类的新方法执行。
Instant instant = myUtilDate.toInstant();
您的java.util.Date
和java.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
、.Calendar
和 java.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.class
和SimpleDateFormat
,然后不是 在 Java8 下使用它是合乎逻辑的。
yourstringdate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());
【讨论】:
仅供参考,诸如java.util.Date
、java.util.Calendar
和 java.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/yyyy
或yyyy-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.Date
、java.util.Calendar
和 java.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的区别及应用