Date+JChat.swift 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. //
  2. // CCDataExtension.swift
  3. // JChat
  4. //
  5. // Created by deng on 2017/2/16.
  6. // Copyright © 2017年 HXHG. All rights reserved.
  7. //
  8. import UIKit
  9. let FORMAT_PAST_SHORT:String = "yyyy/MM/dd"
  10. let FORMAT_PAST_TIME:String = "ahh:mm"
  11. let FORMAT_THIS_WEEK:String = "eee ahh:mm"
  12. let FORMAT_THIS_WEEK_SHORT:String = "eee"
  13. let FORMAT_YESTERDAY:String = "ahh:mm"
  14. let FORMAT_TODAY:String = "ahh:mm"
  15. let D_MINUTE = 60.0
  16. let D_HOUR = 3600.0
  17. let D_DAY = 86400.0
  18. let D_WEEK = 604800.0
  19. let D_YEAR = 31556926.0
  20. internal let componentFlags: NSCalendar.Unit = [.year, .month, .day, .weekday, .hour, .minute, .second, .weekdayOrdinal]
  21. extension Date {
  22. static func currentCalendar1() -> Calendar{
  23. let calendar = Calendar.autoupdatingCurrent
  24. return calendar
  25. }
  26. func isEqualToDateIgnoringTime(_ date:Date) -> Bool{
  27. let components1:DateComponents = (Date.currentCalendar() as NSCalendar).components(componentFlags, from: self)
  28. let components2:DateComponents = (Date.currentCalendar() as NSCalendar).components(componentFlags, from: date)
  29. return (components1.year == components2.year) && (components1.month == components2.month) && ((components1).day == components2.day)
  30. }
  31. func dateByAddingDays(_ days:Int) -> Date {
  32. var dateComponents = DateComponents()
  33. dateComponents.day = days
  34. let newDate:Date = (Calendar.current as NSCalendar).date(byAdding: dateComponents, to: self, options:NSCalendar.Options(rawValue: 0))!
  35. return newDate
  36. }
  37. func dateBySubtractingDays(_ days:Int) -> Date {
  38. return self.dateByAddingDays(days * -1)
  39. }
  40. static func dateWithDaysFromNow(_ days:Int) -> Date {
  41. return Date().dateByAddingDays(days)
  42. }
  43. static func dateWithDaysBeforeNow(_ days:Int) -> Date {
  44. return Date().dateBySubtractingDays(days)
  45. }
  46. static func dateTomorrow() -> Date{
  47. return Date.dateWithDaysFromNow(1)
  48. }
  49. static func dateYesterday() -> Date {
  50. return Date.dateWithDaysBeforeNow(1)
  51. }
  52. func isToday() -> Bool {
  53. return self.isEqualToDateIgnoringTime(Date())
  54. }
  55. func isTomorrow() -> Bool {
  56. return self.isEqualToDateIgnoringTime(Date.dateTomorrow())
  57. }
  58. func isYesterday() -> Bool {
  59. return self.isEqualToDateIgnoringTime(Date.dateYesterday())
  60. }
  61. func isSameWeekAsDate(_ date:Date) -> Bool {
  62. let components1:DateComponents = (Date.currentCalendar1() as NSCalendar).components(componentFlags, from: self)
  63. let components2:DateComponents = (Date.currentCalendar1() as NSCalendar).components(componentFlags, from: date)
  64. if components1.weekOfYear != components2.weekOfYear { return false }
  65. return (fabs(self.timeIntervalSince(date)) < D_WEEK)
  66. }
  67. func isThisWeek() -> Bool {
  68. return self.isSameWeekAsDate(Date())
  69. }
  70. func isThisYear() -> Bool {
  71. let calendar = NSCalendar.current
  72. let year1 = calendar.component(.year, from: Date())
  73. let year2 = calendar.component(.year, from: self)
  74. return year1 == year2
  75. }
  76. func conversationDate() -> String {
  77. // yy-MM-dd hh:mm
  78. // MM-dd hh:mm
  79. // 星期一 hh:mm - 7 * 24小时内
  80. // 昨天 hh:mm - 2 * 24小时内
  81. // 今天 hh:mm - 24小时内
  82. let s1 = TimeInterval(self.timeIntervalSince1970)
  83. let s2 = TimeInterval(time(nil))
  84. let dz = TimeInterval(TimeZone.current.secondsFromGMT())
  85. let formatter = DateFormatter()
  86. // let format1 = DateFormatter.dateFormat(fromTemplate: "hh:mm", options: 0, locale: nil) ?? "hh:mm"
  87. let days1 = Int64(s1 + dz) / (24 * 60 * 60)
  88. let days2 = Int64(s2 + dz) / (24 * 60 * 60)
  89. switch days1 - days2 {
  90. case +0:
  91. // Today
  92. // formatter.dateFormat = "\(format1)"
  93. formatter.dateFormat = "hh:mm"
  94. case +1:
  95. // Tomorrow
  96. formatter.dateFormat = "'明天'"
  97. case +2 ... +7:
  98. // 2 - 7 day later
  99. formatter.dateFormat = "EEEE"
  100. case -1:
  101. formatter.dateFormat = "'昨天'"
  102. case -2:
  103. formatter.dateFormat = "'前天'"
  104. case -7 ... -2:
  105. // 2 - 7 day ago
  106. formatter.dateFormat = "EEEE"
  107. default:
  108. // Distant
  109. if self.isThisYear() {
  110. formatter.dateFormat = "MM-dd"
  111. } else {
  112. formatter.dateFormat = "yy-MM-dd"
  113. }
  114. }
  115. return formatter.string(from: self)
  116. }
  117. }