开发:日期格式的处理(日期终结者)

日期处理

日期格式

Sun May 24 12:12:00 +0800 2015
星期 月 日 时:分:秒 时区 年

要从一个字符串中解析得到准确的时间,必须要指定正确的格式字符串,以及对应的时区标示

日期格式

    • y 将年份 (0-9) 显示为不带前导零的数字
    • yy 以带前导零的两位数字格式显示年份
    • yyy 以四位数字格式显示年份
    • yyyy 以四位数字格式显示年份
    • M 将月份显示为不带前导零的数字(如一月表示为 1)
    • MM 将月份显示为带前导零的数字(例如 01/12/01)
    • MMM 将月份显示为缩写形式(例如 Jan)
    • MMMM 将月份显示为完整月份名(例如 January)
      • 一月 Jan January
      • 二月 Feb February
      • 三月 Mar March
      • 四月 Apr April
      • 五月 May May
      • 六月 Jun June
      • 七月 Jul July
      • 八月 Aug August
      • 九月 Sep September
      • 十月 Oct October
      • 十一月 Nov November
      • 十二月 Dec December
    • d 将日显示为不带前导零的数字(如 1)
    • dd 将日显示为带前导零的数字(如 01)
  • 星期
    • EEE 将日显示为缩写形式(例如 Sun)
    • EEEE 将日显示为全名(例如 Sunday)
      • 星期一 Mon Monday
      • 星期二 Tue Tuesday
      • 星期三 Wed Wednesday
      • 星期四 Thu Thursday
      • 星期五 Fri Friday
      • 星期六 Sat Saturday
      • 星期天 Sun Sunday
  • 小时
    • h 使用 12 小时制将小时显示为不带前导零的数字(例如 1:15:15 PM)
    • hh 使用 12 小时制将小时显示为带前导零的数字(例如 01:15:15 PM)
    • H 使用 24 小时制将小时显示为不带前导零的数字(例如 1:15:15)
    • HH 使用 24 小时制将小时显示为带前导零的数字(例如 01:15:15)
  • 分钟
    • m 将分钟显示为不带前导零的数字(例如 12:1:15)
    • mm 将分钟显示为带前导零的数字(例如 12:01:15)
    • s 将秒显示为不带前导零的数字(例如 12:15:5)
    • ss 将秒显示为带前导零的数字(例如 12:15:05)
    • f 显示秒的小数部分
    • ff 将精确显示到百分之一秒
    • ffff 将精确显示到万分之一秒
    • 用户定义格式中最多可使用七个 f 符号
  • 上午&下午
    • t 使用 12 小时制
      • 中午之前任一小时显示大写的 A
      • 中午到 11:59 PM 之间的任一小时显示大写的 P
    • tt 对于使用 12 小时制的区域设置
      • 中午之前任一小时显示大写的 AM
      • 中午到 11:59 PM 之间的任一小时显示大写的 PM
    • 对于使用 24 小时制的区域设置,不显示任何字符
  • 时区
    • z 显示不带前导零的时区偏移量
    • zz 显示带前导零的时区偏移量(例如 -08)
    • zzz 显示完整的时区偏移量(例如 -0800)
  • 纪元
    • gg 显示时代/纪元字符串(例如 A.D.)

日期转换测试代码

var create_date = "Sun May 24 12:12:00 +0800 2015"
let df = NSDateFormatter()
df.locale = NSLocale(localeIdentifier: "en")
df.dateFormat = "EEE MMM dd HH:mm:ss zzz yyyy"
let date = df.dateFromString(create_date)

日期需求

  • 刚刚(一分钟内)
  • X分钟前(一小时内)
  • X小时前(当天)
  • 昨天 HH:mm(昨天)
  • MM-dd HH:mm(一年内)
  • yyyy-MM-dd HH:mm(更早期)

日期分类

  • 建立 Date+Extension.swift
  • 抽取类函数创建日期
/// 使用新浪日期字符串创建日期
class func sinaDate(string: String) -> NSDate? {
    let df = NSDateFormatter()
    df.locale = NSLocale(localeIdentifier: "ch")
    df.dateFormat = "EEE MMM dd HH:mm:ss zzz yyyy"

    return df.dateFromString(string)
}
  • 由于微博显示日期时随时更新的,因此建立一个函数单独处理日期描述

  • 准备函数如下:

///  返回日期描述字符串
///
///     格式如下
///     -   刚刚(一分钟内)
///     -   X分钟前(一小时内)
///     -   X小时前(当天)
///     -   昨天 HH:mm(昨天)
///     -   MM-dd HH:mm(一年内)
///     -   yyyy-MM-dd HH:mm(更早期)
func dateDescription() -> String {
    return ""
}

在 iOS 中处理日期的详细信息需要借助到 NSCalendar 类,NSCalendar 提供了非常丰富的日期操作函数

  • 日期分段判断
/// 日期描述字符串
var dateDescription: String {

    // 1. 获取当前日历
    let cal = NSCalendar.currentCalendar()

    // 2. 判断当前日期
    if cal.isDateInToday(self) {
        return "今天"
    }

    // 3. 其他日期
    if cal.isDateInYesterday(self) {
        return "昨天"
    }

    return "其他"
}
  • 测试数据
print(NSDate.sinaDate("Mon Aug 10 12:12:00 +0800 2015")?.dateDescription)
print(NSDate.sinaDate("Mon Aug 09 12:12:00 +0800 2015")?.dateDescription)
print(NSDate.sinaDate("Mon Aug 08 12:12:00 +0800 2015")?.dateDescription)
print(NSDate.sinaDate("Mon Aug 08 12:12:00 +0800 2014")?.dateDescription)
  • 日历函数
canlendar.components(NSCalendarUnit.Year, fromDate: self)
  • 比较两个日期
let coms = cal.components(NSCalendarUnit.Year, fromDate: self, toDate: NSDate(), options: NSCalendarOptions(rawValue: 0))
if coms.year == 0 {

}

print(coms.year)
  • 计算非今天的日期信息
// 3. 其他日期
var fmtString = "HH:mm"
if cal.isDateInYesterday(self) {
    fmtString = "昨天 " + fmtString
} else {
    fmtString = "MM-dd " + fmtString

    let coms = cal.components(NSCalendarUnit.Year, fromDate: self, toDate: NSDate(), options: NSCalendarOptions(rawValue: 0))

    if coms.year != 0 {
        fmtString = "yyyy-" + fmtString
    }
}

let df = NSDateFormatter()
df.locale = NSLocale(localeIdentifier: "en")
df.dateFormat = fmtString

return df.stringFromDate(self)
  • 计算今天的日期信息
// 2. 今天
if cal.isDateInToday(self) {
    let delta = Int(NSDate().timeIntervalSinceDate(self))

    if delta < 60 {
        return "刚刚"
    }
    if delta < 3600 {
        return String(delta / 60) + " 分钟前"
    }

    return String(delta / 3600) + " 小时前"
}

集成日期处理

  • 将分类拖拽至项目的 Tools 目录
  • 修改 StatusCell 中的日期显示
timeLabel.text = NSDate.sinaDate(status?.created_at ?? "")?.dateDescription

运行测试:D

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值