Java 中有 java.text.DateFormat 这个类来专门处理日期格式,它的实例仅能通过三个工厂方法获取,然后就可以调用 format()parse() 方法来格式化和解析了。

  • DateFormat.getDateInstance([int style[, Locale aLocale]])
  • DateFormat.getDateTimeInstance([int dateStyle, int timeStyle[, Locale aLocale]])
  • DateFormat.getTimeInstance([int style[, Locale aLocale]])

其中的 style 可以是 SHORT, MEDIUM, LONG 或者 FULL。

  • SHORT is completely numeric, such as 12.13.52 or 3:30pm
  • MEDIUM is longer, such as Jan 12, 1952
  • LONG is longer, such as January 12, 1952 or 3:30:32pm
  • FULL is pretty completely specified, such as Tuesday, April 12, 1952 AD or 3:30:42pm PST.

我们常用的是其子类 SimpleDateFormat,它可以直接传入一个字符串 pattern 来定义格式,详细文档可以看这里 http://developer.android.com/intl/zh-cn/reference/java/text/SimpleDateFormat.html

坑出没注意
如果要解析的日期字符串不是纯数字(比如含有用文字表示的的月份或者周几)的话,一定要记得传入 Locale。

另外一种日期的格式化问题就是弄成那种像 2小时前1天前 这样的格式。Android 其实自带了一个 DataUtils 类来处理这种格式。

formatDateRange() 可以格式化时间段,比如 3:00pm - 4:00pm,或者 Dec 31, 2007 - Jan 1, 2008
formatElapsedTime() 可以传入秒数,格式化成 MM:SSH:MM:SS
formatSameDayTime 需要传入 now 参数,对在同一天的时间显示时间,不是同一天则仅显示日期。
getRelativeDateTimeString() 就是我们常见的 2小时前 格式了。