如何将Joda-Time DateTime格式化为仅mm / dd / yyyy?


189

我有一个字符串“ 11/15/2013 08:00:00”,我想将其格式化为“ 11/15/2013”,正确的DateTimeFormatter模式是什么?

我已经尝试了很多,并用谷歌搜索,但仍然找不到正确的模式。

编辑:我正在寻找Joda-Time DateTimeFormatter,而不是Java的SimpleDateFormat。


2
tl; dr: DateTimeFormat.forPattern(“ MM / dd / yyyy HH:mm:ss”)。print(DateTime.now())
Andrew

Answers:


385

乔达时间

创建一个DateTimeFormatter使用DateTimeFormat.forPattern(String)

使用Joda时间,您可以这样做:

String dateTime = "11/15/2013 08:00:00";
// Format for input
DateTimeFormatter dtf = DateTimeFormat.forPattern("MM/dd/yyyy HH:mm:ss");
// Parsing the date
DateTime jodatime = dtf.parseDateTime(dateTime);
// Format for output
DateTimeFormatter dtfOut = DateTimeFormat.forPattern("MM/dd/yyyy");
// Printing the date
System.out.println(dtfOut.print(jodatime));

标准Java≥8

Java 8引入了新的日期和时间库,使处理日期和时间更加容易。如果要使用标准Java版本8或更高版本,则可以使用DateTimeFormatter。由于您Stringjava.time.LocalDateTimeLocalDate中没有时区,因此可以使用时区变体ZonedDateTimeZonedDate

// Format for input
DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
// Parsing the date
LocalDate date = LocalDate.parse(dateTime, inputFormat);
// Format for output
DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("MM/dd/yyyy");
// Printing the date
System.out.println(date.format(outputFormat));

标准Java <8

在Java 8之前,您将使用SimpleDateFormatjava.util.Date

String dateTime = "11/15/2013 08:00:00";
// Format for input
SimpleDateFormat dateParser = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
// Parsing the date
Date date7 = dateParser.parse(dateTime);
// Format for output
SimpleDateFormat dateFormatter = new SimpleDateFormat("MM/dd/yyyy");
// Printing the date
System.out.println(dateFormatter.format(date7));

7
抱歉,但是我正在寻找jodatime的DateTimeFormatter。
iCodeLikeImDrunk 2013年

1
@yaojiang Joda使用与相同的格式字符串语法SimpleDateFormat。阅读API文档。
耶斯珀(Jesper)2013年

@yaojiang正如Jesper所述,Joda使用相同的格式字符串,尽管它具有更多选项。我将示例扩展为包括Joda,您可以看到它非常相似。
DeltaLima 2013年

奇怪的是我正在使用DateTimeFormatter dtf = DateTimeFormat.forPattern(“ MM / dd / yyyy”); 而且我仍然收到“ mm / dd / yyyy hh:mm:ss” ...
iCodeLikeImDrunk 2013年

2
尽管Joda-Time使用与java.util.Date/Calendar非常相似的格式代码,但请仔细阅读文档以了解细微差异。它们是不相同的。
罗勒·布尔克

45

即使其他答案完全可以接受,我还是在这里添加。JodaTime预先内置了DateTimeFormat解析器:

dateTime.toString(DateTimeFormat.longDate());

这是大多数以其格式打印出来的选项:

shortDate:         11/3/16
shortDateTime:     11/3/16 4:25 AM
mediumDate:        Nov 3, 2016
mediumDateTime:    Nov 3, 2016 4:25:35 AM
longDate:          November 3, 2016
longDateTime:      November 3, 2016 4:25:35 AM MDT
fullDate:          Thursday, November 3, 2016
fullDateTime:      Thursday, November 3, 2016 4:25:35 AM Mountain Daylight Time

1
很好,知道这个版本是什么版本吗?通过不创建愚蠢的格式字符串来节省大量时间...
iCodeLikeImDrunk

是的,我完全同意。看起来它一直都在那里。 joda-time.sourceforge.net/apidocs/org/joda/time/format / ...
乍得·宾厄姆

21
DateTime date = DateTime.now().withTimeAtStartOfDay();
date.toString("HH:mm:ss")

1
尽管并不能完全回答问题,但这很有用。单行版本:DateTime.now().toString("HH:mm:ss")
hBrent

11

如果您使用的是JodaTime,我认为这会起作用:

String strDateTime = "11/15/2013 08:00:00";
DateTime dateTime = DateTime.parse(strDateTime);
DateTimeFormatter fmt = DateTimeFormat.forPattern("MM/dd/YYYY");
String strDateOnly = fmt.print(dateTime);

我从这里得到了一部分。


您指向文档的链接已过时。正确的网址是:joda.org/joda-time/apidocs/org/joda/time/format/…–
Basil Bourque

1
@BasilBourque感谢您指出该D日期是一年中的某一天,但是我的“文档链接”尚未过期:我链接到的文档已过期。我并不是为了自己而链接到文档,而是链接到我从中获得一些代码的页面,而该页面恰好是过时的文档。
帽子的家伙

10

我有一个很愚蠢但可行的选择。如果您有String fullDate =“ 11/15/2013 08:00:00”;

   String finalDate = fullDate.split(" ")[0];

那应该轻松快捷地工作。:)


是的,我一定会改变格式。这有效,但仅在这种情况下。
iCodeLikeImDrunk

1
行为不是真正预期的,之后没有人(包括您在内)看到您的代码,您对此一无所知……
Sercan Ozdemir 2015年

3

更新:

您可以:创建一个常量:

private static final DateTimeFormatter DATE_FORMATTER_YYYY_MM_DD =
          DateTimeFormat.forPattern("yyyy-MM-dd"); // or whatever pattern that you need.

此DateTimeFormat从以下位置导入:(请谨慎操作)

导入org.joda.time.format.DateTimeFormat; 导入org.joda.time.format.DateTimeFormatter;

解析日期:

DateTime.parse(dateTimeScheduled.toString(), DATE_FORMATTER_YYYY_MM_DD);

之前:
DateTime.parse(“ 201711201515”,DateTimeFormat.forPattern(“ yyyyMMddHHmm”))。toString(“ yyyyMMdd”);

如果想要日期时间:

DateTime.parse("201711201515", DateTimeFormat.forPattern("yyyyMMddHHmm")).withTimeAtStartOfDay();

2

这有效

String x = "22/06/2012";
String y = "25/10/2014";

String datestart = x;
String datestop = y;

//DateTimeFormatter format = DateTimeFormat.forPattern("dd/mm/yyyy");
SimpleDateFormat  format = new SimpleDateFormat("dd/mm/yyyy");

Date d1 = null;
Date d2 = null;

try {
    d1 =  format.parse(datestart);
    d2 = format.parse(datestop);

    DateTime dt1 = new DateTime(d1);
    DateTime dt2 = new DateTime(d2);

    //Period
    period = new Period (dt1,dt2);

    //calculate days
    int days = Days.daysBetween(dt1, dt2).getDays();


} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

1

另一种方法是:

String date = dateAndTime.substring(0, dateAndTime.indexOf(" "));

我不确定,但是我认为这可能比使用该.split()方法更快/使用更少的内存。

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.