iOS总结: DateFormatter、NSDate日期时间终章篇

从内存、易读性、易用性三个方面持续优化,感觉臻至完美,好长一段时间没有新的优化灵感了,遂分享给大家。有更好的请留言,我喜欢把一些事情做到极致。

/*
 G: 公元时代,例如AD公元
 yy: 年的后2位
 yyyy: 完整年
 MM: 月,显示为1-12
 MMM: 月,显示为英文月份简写,如 Jan
 MMMM: 月,显示为英文月份全称,如 Janualy
 dd: 日,2位数表示,如02
 d: 日,1-2位显示,如 2
 EEE: 简写星期几,如Sun
 EEEE: 全写星期几,如Sunday
 aa: 上下午,AM/PM
 H: 时,24小时制,0-23
 K:时,12小时制,0-11
 m: 分,1-2位
 mm: 分,2位
 s: 秒,1-2位
 ss: 秒,2位
 S: 毫秒
 */

import UIKit

/// 60s
public let kDate_minute : Double = 60 ;
/// 3600s
public let kDate_hour : Double   = 3600 ;
/// 86400
public let kDate_day : Double    = 86400 ;
/// 604800
public let kDate_week : Double   = 604800 ;
/// 31556926
public let kDate_year : Double   = 31556926 ;


/// yyyy-MM-dd HH:mm:ss(默认)
public let kDateFormat             = "yyyy-MM-dd HH:mm:ss";
/// yyyy-MM
public let kDateFormat_month       = "yyyy-MM";
/// yyyy-MM-dd
public let kDateFormat_day         = "yyyy-MM-dd";
/// yyyy-MM-dd HH
public let kDateFormat_hour        = "yyyy-MM-dd HH";
/// yyyy-MM-dd HH:mm
public let kDateFormat_minute      = "yyyy-MM-dd HH:mm";
/// yyyy-MM-dd HH:mm:ss eee
public let kDateFormat_millisecond = "yyyy-MM-dd HH:mm:ss eee";
/// yyyy-MM-dd 00:00:00
public let kDateFormat_start       = "yyyy-MM-dd 00:00:00";
/// yyyy-MM-dd 23:59:59
public let kDateFormat_end         = "yyyy-MM-dd 23:59:59";
/// yyyy年M月
public let kDateFormat_month_ch    = "yyyy年MM月";
/// yyyy年MM月dd日
public let kDateFormat_day_ch      = "yyyy年MM月dd日";
/// yyyyMMdd
public let kDateFormat_two         = "yyyyMMdd";

@objc public extension DateFormatter{
    
    /// 获取DateFormatter(默认格式)
    static func format(_ formatStr: String = kDateFormat) -> DateFormatter {
        let dic = Thread.current.threadDictionary;
        if dic.object(forKey: formatStr) != nil {
            return dic.object(forKey: formatStr) as! DateFormatter;
        }
        
        let fmt = DateFormatter();
        fmt.dateFormat = formatStr;
        fmt.locale = .current;
        fmt.locale = Locale(identifier: "zh_CN");

        fmt.timeZone = NSTimeZone.local;
        dic.setObject(fmt, forKey: formatStr as NSCopying)
        return fmt;
    }
    
       /// Date -> String
    static func stringFromDate(_ date: Date, fmt: String = kDateFormat) -> String {
        let formatter = DateFormatter.format(fmt);
        return formatter.string(from: date);
    }
    
    /// String -> Date
    static func dateFromString(_ dateStr: String, fmt: String = kDateFormat) -> Date? {
        let formatter = DateFormatter.format(fmt);
        let tmp = dateStr.count > fmt.count ? (dateStr as NSString).substring(to: fmt.count) : dateStr
        let result = formatter.date(from: tmp);
        return result
    }
    
    /// 时间戳字符串 -> 日期字符串
    static func stringFromInterval(_ interval: String, fmt: String = kDateFormat) -> String {
        let date = Date(timeIntervalSince1970: interval.doubleValue)
        return DateFormatter.stringFromDate(date, fmt: fmt);
    }

    /// 日期字符串 -> 时间戳字符串
    static func intervalFromDateStr(_ dateStr: String, fmt: String = kDateFormat) -> String {
        guard let date = DateFormatter.dateFromString(dateStr, fmt: fmt) else {
            return "0" }
        return "\(date.timeIntervalSince1970)";
    }

你可能感兴趣的:(iOS总结: DateFormatter、NSDate日期时间终章篇)