Date+Extension.swift 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. //
  2. // Date+Extension.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/12/14.
  6. //
  7. import Foundation
  8. extension Date {
  9. // 辅助方法:格式化 "时:分"(补零,如 09:05)
  10. func formattedTime() -> String {
  11. let formatter = DateFormatter()
  12. formatter.locale = curLocal
  13. formatter.dateFormat = "HH:mm"
  14. return formatter.string(from: self)
  15. }
  16. // 辅助方法:格式化 "星期一"
  17. func formattedWeek() -> String {
  18. let formatter = DateFormatter()
  19. formatter.locale = curLocal
  20. formatter.dateFormat = "EEEE"
  21. return formatter.string(from: self)
  22. }
  23. // 辅助方法:格式化 "星期 时:分"(如 星期一 09:30)
  24. func formattedWeekWithTime() -> String {
  25. let formatter = DateFormatter()
  26. formatter.locale = curLocal
  27. formatter.dateFormat = "EEEE HH:mm"
  28. return formatter.string(from: self)
  29. }
  30. // 辅助方法:格式化 "月/日"(如 10/23)
  31. func formattedDate(_ separator: String = "/") -> String {
  32. let formatter = DateFormatter()
  33. formatter.locale = curLocal
  34. formatter.dateFormat = "MM\(separator)dd"
  35. return formatter.string(from: self)
  36. }
  37. // 辅助方法:格式化 "月/日 时:分"(如 10/23 14:30)
  38. func formattedDateWithTime(_ separator: String = "/") -> String {
  39. let formatter = DateFormatter()
  40. formatter.locale = curLocal
  41. formatter.dateFormat = "MM\(separator)dd HH:mm"
  42. return formatter.string(from: self)
  43. }
  44. // 辅助方法:格式化 "日/月/年"(如 23/10/2025)
  45. func formattedFullDate(_ separator: String = "/", normal: Bool = false) -> String {
  46. let formatter = DateFormatter()
  47. formatter.locale = curLocal
  48. if normal {
  49. formatter.dateFormat = "yyy\(separator)MM\(separator)dd"
  50. } else {
  51. formatter.dateFormat = "dd\(separator)MM\(separator)yyyy"
  52. }
  53. return formatter.string(from: self)
  54. }
  55. // 辅助方法:格式化 "年/月/日 时:分"(如 2025/10/23 14:30)
  56. func formattedFullDateWithTime(_ separator: String = "/") -> String {
  57. let formatter = DateFormatter()
  58. formatter.locale = curLocal
  59. formatter.dateFormat = "dd\(separator)MM\(separator)yyyy HH:mm"
  60. return formatter.string(from: self)
  61. }
  62. var tencentIMTimeDesc: String {
  63. if self == Date.distantPast {
  64. return ""
  65. }
  66. let dateFmt = DateFormatter()
  67. dateFmt.locale = curLocal
  68. var calendar = Calendar.current
  69. calendar.firstWeekday = 7
  70. let nowComponent: DateComponents = calendar.dateComponents([.day, .month, .year, .weekOfMonth], from: Date())
  71. let dateComponent: DateComponents = calendar.dateComponents([.day, .month, .year, .weekOfMonth], from: self)
  72. if nowComponent.year == dateComponent.year {
  73. if nowComponent.month == dateComponent.month {
  74. if nowComponent.weekOfMonth == dateComponent.weekOfMonth {
  75. if nowComponent.day == dateComponent.day {
  76. dateFmt.dateFormat = "HH:mm"
  77. } else {
  78. dateFmt.dateFormat = "EEEE"
  79. }
  80. } else {
  81. dateFmt.dateFormat = "MM/dd"
  82. }
  83. } else {
  84. dateFmt.dateFormat = "MM/dd"
  85. }
  86. } else {
  87. dateFmt.dateFormat = "dd/MM/yyyy"
  88. }
  89. return dateFmt.string(from: self)
  90. }
  91. func yearAgo(_ year: Int) -> Date {
  92. let calendar = Calendar.current
  93. let yearsAgoComponents = DateComponents(year: year, day: -1)
  94. guard let yearsAgo = calendar.date(byAdding: yearsAgoComponents, to: Date()) else {
  95. return Date()
  96. }
  97. return yearsAgo
  98. }
  99. }
  100. extension Date {
  101. var inMinutes: Bool {
  102. timeIntervalSince1970.inMinutes
  103. }
  104. var inHour: Bool {
  105. timeIntervalSince1970.inHour
  106. }
  107. var inDay: Bool {
  108. timeIntervalSince1970.inDay
  109. }
  110. var isSameDay: Bool {
  111. Calendar.current.isDate(Date(), inSameDayAs: self)
  112. }
  113. }