我有两个约会 - 开始和结束。我想格式化它们,以便在月份匹配时,它们会崩溃到类似“20-23 AUG”的状态,并且如果它们在月底突破,仍然可以正确格式化,例如“20 SEP - 1 OCT”。是否有任何库可用于实现此目的,或者我是否必须使用单独的DateFormats来处理显示日期范围的代码规则?
答案 0 :(得分:6)
这是一个使用JodaTime的解决方案,这是用于处理Java中日期的最佳库(我上次检查过)。格式化很简单,使用自定义DateFormatter实现无疑可以改进。这也检查年份是否相同,但不输出年份,这可能会造成混淆。
import org.joda.time.DateTime;
public class DateFormatterTest {
public static void main(String[] args) {
DateTime august23rd = new DateTime(2010, 8, 23, 0, 0, 0, 0);
DateTime august25th = new DateTime(2010, 8, 25, 0, 0, 0, 0);
DateTime september5th = new DateTime(2010, 9, 5, 0, 0, 0, 0);
DateFormatterTest tester = new DateFormatterTest();
tester.outputDate(august23rd, august25th);
tester.outputDate(august23rd, september5th);
}
private void outputDate(DateTime firstDate, DateTime secondDate) {
if ((firstDate.getMonthOfYear() == secondDate.getMonthOfYear()) && (firstDate.getYear() == secondDate.getYear())) {
System.out.println(firstDate.getDayOfMonth() + " - " + secondDate.getDayOfMonth() + " " + firstDate.monthOfYear().getAsShortText());
} else {
System.out.println(firstDate.getDayOfMonth() + " " + firstDate.monthOfYear().getAsShortText() + " - " + secondDate.getDayOfMonth() + " " + secondDate.monthOfYear().getAsShortText());
}
}
}
输出:
8月23日至25日
8月23日 - 9月5日
答案 1 :(得分:3)
结帐java的SimpleDateFormat课程。您可以构造一个SimpleDateFormat,将日期模式作为String传递。
答案 2 :(得分:3)
我对其他答案感到失望。 Joda时间在GWT中不起作用,SimpleDateFormat也不起作用。无论如何,我已经知道了GWT中的DateTimeFormat。主要问题是不推荐使用日期对象getMonth()函数,并且似乎没有一种比较月和/或年的好方法。此解决方案不包括年度检查(可以通过更改monthFormatter轻松添加),但这对我的情况并不重要。
public final class DateUtility
{
public static final DateTimeFormat MONTH_FORMAT = DateTimeFormat.getFormat("MMM");
public static final DateTimeFormat DAY_FORMAT = DateTimeFormat.getFormat("dd");
public static final DateTimeFormat DAY_MONTH_FORMAT = DateTimeFormat.getFormat("dd MMM");
public static final String DASH = " - ";
/**
* Returns a "collapsed" date range String representing the period of time
* between two Date parameters. Example: August 19 as a {@code startDate}
* and August 30 as an {@code endDate} will return "19 - 30 AUG", August 28
* as a {@code startDate} and September 7 as an {@code endDate} will return
* "28 AUG - 07 SEP". This means if you pass this two dates which cannot
* collapse into a shorter form, then the longer form is returned. Years
* are ignored, and the start and end dates are not checked to ensure we
* are not going backwards in time (Aug 10 - July 04 is not checked).
*
* @param startDate
* the start Date in the range.
* @param endDate
* the end Date in the range.
* @return a String representation of the range between the two dates given.
*/
public static String collapseDate(Date startDate, Date endDate) {
String formattedDateRange;
// Get a comparison result to determine if the Months are the same
String startDateMonth = MONTH_FORMAT.format(startDate);
String endDateMonth = MONTH_FORMAT.format(endDate);
if (startDateMonth.equals(endDateMonth))
{
formattedDateRange = DAY_FORMAT.format(startDate) + DASH
+ DAY_MONTH_FORMAT.format(endDate).toUpperCase();
}
else
{
// Months don't match, split the string across both months
formattedDateRange = DAY_MONTH_FORMAT.format(startDate).toUpperCase()
+ DASH + DAY_MONTH_FORMAT.format(endDate).toUpperCase();
}
return formattedDateRange;
}
}
答案 3 :(得分:1)
要添加到Jeroen的答案,您将使用两次SimpleDateFormat,一次用于范围的每一端。
答案 4 :(得分:0)
默认情况下,Java中没有类型为日期范围的类型,因此没有任何DateFormats适用于此案例的字符串表示形式。
我认为最好的是创建TimeSpan或TimeDiff类型并将方法重写为字符串。或者,如果您还需要两个解析,则建议您创建一个DateFormmater。