代码之家  ›  专栏  ›  技术社区  ›  SorcyCat

如何在Java中格式化日期范围?

  •  3
  • SorcyCat  · 技术社区  · 14 年前

    我有两个约会-开始和结束。我想对它们进行格式化,这样如果月份匹配,它们将崩溃为“8月20-23日”这样的值,如果它们在月末中断,仍然可以正确格式化,如“9月20日-10月1日”。有没有实现这一点的库,或者我需要使用单独的日期格式手工编写显示日期范围的代码规则?

    5 回复  |  直到 14 年前
        1
  •  6
  •   stark    14 年前

    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日

        2
  •  4
  •   SorcyCat    12 年前

    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
  •  3
  •   Jeroen Rosenberg    14 年前

    签出java的 SimpleDateFormat 班级。您可以构造一个SimpleDataFormat,将您的日期模式作为字符串传递。

        4
  •  1
  •   Dean J    14 年前

    为了补充Jeroen的答案,您将使用SimpleDateFormat两次,范围的每一端使用一次。

        5
  •  0
  •   Damian Leszczyński - Vash    14 年前

    默认情况下,Java中没有day range这样的类型,因此没有任何DateFormats应用于这种情况的字符串表示。

    在我看来,最好是创建TimeSpan或TimeDiff类型,并将方法重写为string。或者像你建议的那样,如果你需要两个,也可以创建一个DateFormmater。