agf*_*105 54 time nsdate foundation ios swift
在一个快速的操场上,我一直在使用
NSDate.date()
Run Code Online (Sandbox Code Playgroud)
但是,这总是会附加时间元素.对于我的应用程序,我需要忽略时间元素.这在Swift中可能吗?怎么做到呢?即使我可以将时间元素设置为每个日期也同时工作.
此外,我正在尝试比较两个日期,目前我正在使用以下代码:
var earlierDate:NSDate = firstDate.earlierDate(secondDate)
Run Code Online (Sandbox Code Playgroud)
这是唯一的方法,还是可以忽略时间元素的方式?例如,如果他们是同一天,但不同的时间,我不想要结果.
Ash*_*lls 113
使用此Calendar功能可以比较iOS 8.0+中的日期
func compare(_ date1: Date, to date2: Date, toGranularity component: Calendar.Component) -> ComparisonResult
Run Code Online (Sandbox Code Playgroud)
.day作为单位
传球
使用此功能如下:
let now = Date()
// "Sep 23, 2015, 10:26 AM"
let olderDate = Date(timeIntervalSinceNow: -10000)
// "Sep 23, 2015, 7:40 AM"
var order = Calendar.current.compare(now, to: olderDate, toGranularity: .hour)
switch order {
case .orderedDescending:
print("DESCENDING")
case .orderedAscending:
print("ASCENDING")
case .orderedSame:
print("SAME")
}
// Compare to hour: DESCENDING
var order = Calendar.current.compare(now, to: olderDate, toGranularity: .day)
switch order {
case .orderedDescending:
print("DESCENDING")
case .orderedAscending:
print("ASCENDING")
case .orderedSame:
print("SAME")
}
// Compare to day: SAME
Run Code Online (Sandbox Code Playgroud)
sla*_*mor 16
iOS 8.0+中的NSCalendar中有几种有用的方法:
startOfDayForDate, isDateInToday, isDateInYesterday, isDateInTomorrow
Run Code Online (Sandbox Code Playgroud)
甚至比较日子:
func isDate(date1: NSDate!, inSameDayAsDate date2: NSDate!) -> Bool
Run Code Online (Sandbox Code Playgroud)
要忽略time元素,可以使用:
var toDay = Calendar.current.startOfDay(for: Date())
Run Code Online (Sandbox Code Playgroud)
但是,如果你还必须支持iOS 7,你总是可以写一个扩展名
extension NSCalendar {
func myStartOfDayForDate(date: NSDate!) -> NSDate!
{
let systemVersion:NSString = UIDevice.currentDevice().systemVersion
if systemVersion.floatValue >= 8.0 {
return self.startOfDayForDate(date)
} else {
return self.dateFromComponents(self.components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay, fromDate: date))
}
}
}
Run Code Online (Sandbox Code Playgroud)
Sar*_*ith 13
检查日期是否具有同一天组件。
Calendar.current.isDate(date1, equalTo: date2, toGranularity: .day)
Run Code Online (Sandbox Code Playgroud)
根据需要调整到粒度。
小智 8
我写了以下方法,通过借用Ashley Mills解决方案来比较两个日期.它比较两个日期,如果两个日期相同,则返回true(剥离时间).
func compareDate(date1:NSDate, date2:NSDate) -> Bool {
let order = NSCalendar.currentCalendar().compareDate(date1, toDate: date2,
toUnitGranularity: .Day)
switch order {
case .OrderedSame:
return true
default:
return false
}
}
Run Code Online (Sandbox Code Playgroud)
它被称为这样:
if compareDate(today, date2: anotherDate) {
// The two dates are on the same day.
}
Run Code Online (Sandbox Code Playgroud)
在Swift 4中:
func compareDate(date1:Date, date2:Date) -> Bool {
let order = NSCalendar.current.compare(date1, to: date2, toGranularity: .day)
switch order {
case .orderedSame:
return true
default:
return false
}
}
Run Code Online (Sandbox Code Playgroud)
两个日期在swift中的比较.
// Date comparision to compare current date and end date.
var dateComparisionResult:NSComparisonResult = currentDate.compare(endDate)
if dateComparisionResult == NSComparisonResult.OrderedAscending
{
// Current date is smaller than end date.
}
else if dateComparisionResult == NSComparisonResult.OrderedDescending
{
// Current date is greater than end date.
}
else if dateComparisionResult == NSComparisonResult.OrderedSame
{
// Current date and end date are same.
}
Run Code Online (Sandbox Code Playgroud)
对于 iOS7 支持
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let date1String = dateFormatter.stringFromDate(date1)
let date2String = dateFormatter.stringFromDate(date2)
if date1String == date2String {
println("Equal date")
}
Run Code Online (Sandbox Code Playgroud)
您可以使用它的描述来比较两个日期。
let date1 = NSDate()
let date2 = NSDate(timeIntervalSinceNow: 120)
if date1.description == date2.description {
print(true)
} else {
print(false) // false (I have added 2 seconds between them)
}
Run Code Online (Sandbox Code Playgroud)
如果要将日期的时间元素设置为不同的时间,可以执行以下操作:
extension NSDate {
struct Calendar {
static let gregorian = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
}
var day: Int { return Calendar.gregorian.component(.Day, fromDate: self) }
var month: Int { return Calendar.gregorian.component(.Month, fromDate: self) }
var year: Int { return Calendar.gregorian.component(.Year, fromDate: self) }
var noon: NSDate {
return Calendar.gregorian.dateWithEra(1, year: year, month: month, day: day, hour: 12, minute: 0, second: 0, nanosecond: 0)!
}
}
let date1 = NSDate()
let date2 = NSDate(timeIntervalSinceNow: 120)
print(date1.noon == date2.noon) // true
Run Code Online (Sandbox Code Playgroud)
或者你也可以使用 NSDateFormatter 来做到这一点:
extension NSDate {
struct Date {
static let formatterYYYYMMDD: NSDateFormatter = {
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyyMMdd"
return formatter
}()
}
var yearMonthDay: String {
return Date.formatterYYYYMMDD.stringFromDate(self)
}
func isSameDayAs(date:NSDate) -> Bool {
return yearMonthDay == date.yearMonthDay
}
}
let date1 = NSDate()
let date2 = NSDate(timeIntervalSinceNow: 120)
print(date1.yearMonthDay == date2.yearMonthDay) // true
print(date1.isSameDayAs(date2)) // true
Run Code Online (Sandbox Code Playgroud)
另一种选择(iOS8+)是使用日历方法 isDate(inSameDayAsDate:):
extension NSDate {
struct Calendar {
static let gregorian = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
}
func isInSameDayAs(date date: NSDate) -> Bool {
return Calendar.gregorian.isDate(self, inSameDayAsDate: date)
}
}
let date1 = NSDate()
let date2 = NSDate(timeIntervalSinceNow: 120)
if date1.isInSameDayAs(date: date2 ){
print(true) // true
} else {
print(false)
}
Run Code Online (Sandbox Code Playgroud)
我写了一个 Swift 4 扩展来比较两个日期:
import Foundation
extension Date {
func isSameDate(_ comparisonDate: Date) -> Bool {
let order = Calendar.current.compare(self, to: comparisonDate, toGranularity: .day)
return order == .orderedSame
}
func isBeforeDate(_ comparisonDate: Date) -> Bool {
let order = Calendar.current.compare(self, to: comparisonDate, toGranularity: .day)
return order == .orderedAscending
}
func isAfterDate(_ comparisonDate: Date) -> Bool {
let order = Calendar.current.compare(self, to: comparisonDate, toGranularity: .day)
return order == .orderedDescending
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
startDate.isSameDateAs(endDate) // returns a true or false
| 归档时间: |
|
| 查看次数: |
43297 次 |
| 最近记录: |