java.util.Date
对象转换为String
。格式为
2010-05-30 22:15:52
#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; drmyUtilDate.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时间轴上的时刻,其分辨率为纳秒(最多十进制的九(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
请参见代码在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
,.Calendar
和java.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.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)已成为旧版,由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
评论
类似的问题:stackoverflow.com/questions/4772425/format-date-in-java@harschware仅供参考,Joda-Time项目现在处于维护模式,团队建议迁移到java.time类。请参见Oracle教程。
我建议您不要在2019年使用“日期”。该课程的设计欠佳,而且过时了。而是使用Instant或现代Java日期和时间API java.time中的另一个类。