2014-11-15 20 views
38

Làm cách nào để tạo đối tượng NSDate với ngày tùy chỉnh khác với ngày hiện tại? Ví dụ tôi muốn tạo một var ngày hôm qua hoặc 2 ngày trước.NSDate của ngày hôm qua

Trả lời

-2
let twoDaysAgo = NSDate(timeIntervalSinceNow: -2*24*60*60) 
+0

Hội chợ đủ, đặc biệt đối với khoảng thời gian phức tạp hơn ngày. – microtherion

+1

Giải pháp này không tính đến DST. – Andriy

+0

@Andriy, true, như @Rob đã chỉ ra trong một nhận xét kể từ khi xóa. Tuy nhiên, nó phụ thuộc vào những gì bạn cần 'NSDate' cho. Đôi khi một cái gì đó đơn giản như trên sẽ làm, và đôi khi giải pháp dựa trên 'NSCalendar' không hoàn toàn đúng:" Hai ngày trước "có thể có hoặc không có nghĩa là" thời gian đồng hồ chính xác vào ngày hôm trước ". – microtherion

67

Bạn nên sử dụng NSCalendar để tính ngày. Ví dụ, trong Swift 3 ngày hai ngày trước hôm nay là:

let calendar = Calendar.current 
let twoDaysAgo = calendar.date(byAdding: .day, value: -2, to: Date()) 

Hoặc trong Swift 2:

let calendar = NSCalendar.currentCalendar() 
let twoDaysAgo = calendar.dateByAddingUnit(.Day, value: -2, toDate: NSDate(), options: []) 

Hoặc để có được đầu tiên của tháng, bạn có thể lấy ngày, tháng và năm từ ngày hiện tại, điều chỉnh ngày đến ngày đầu tiên của tháng và sau đó tạo đối tượng ngày mới. Trong Swift 3:

var components = calendar.dateComponents([.year, .month, .day], from: Date()) 
components.day = 1 
let firstOfMonth = calendar.date(from: components)] 

Hoặc trong Swift 2:

let components = calendar.components([.Year, .Month, .Day], fromDate: NSDate()) 
components.day = 1 
let firstOfMonth = calendar.dateFromComponents(components) 

Có rất nhiều chức năng hữu ích trong lớp NSCalendar/Calendar, vì vậy bạn nên điều tra hơn nữa. Xem NSCalendar class reference để biết thêm thông tin.

Nhưng tôi khuyên bạn không nên thực hiện bất kỳ điều chỉnh thủ công nào của các đối tượng ngày bằng cách điều chỉnh nó theo một khoảng thời gian là bội số của mỗi giây (ví dụ: 24 * 60 * 60). Kỹ thuật đó hoạt động tốt nếu bạn chỉ cần thêm một khoảng thời gian, nhưng để tính toán ngày, bạn thực sự muốn sử dụng đối tượng lịch, để tránh các vấn đề xuất phát từ tiết kiệm ban ngày và tương tự.

+0

DayCalendarUnit không được chấp nhận trong OS X v10.10. –

+0

bạn nên thay đổi nó thành .CalendarUnitDay –

+0

để haiDaysAgo = NSCalendar.currentCalendar(). DateByAddingUnit (.CalendarUnitDay, giá trị: -2, toDate: NSDate(), tùy chọn: nil) –

-4

Vui lòng thử mã bên dưới. Tôi nghĩ nó đơn giản.

let today = NSDate() 
let tomorrow = today.dateByAddingTimeInterval(24 * 60 * 60) 
let yesterday = today.dateByAddingTimeInterval(-24 * 60 * 60) 

Chúc mừng !!!

2

Mã cho Swift 2,0

static func yesterDay() -> NSDate { 

    let today: NSDate = NSDate() 

    let daysToAdd:Int = -1 

    // Set up date components 
    let dateComponents: NSDateComponents = NSDateComponents() 
    dateComponents.day = daysToAdd 

    // Create a calendar 
    let gregorianCalendar: NSCalendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)! 
    let yesterDayDate: NSDate = gregorianCalendar.dateByAddingComponents(dateComponents, toDate: today, options:NSCalendarOptions(rawValue: 0))! 

    return yesterDayDate 
} 
2

Câu trả lời của Rob hoạt động tuyệt vời. Nếu bạn đang sử dụng nhiều loại tính toán đó, bạn thậm chí có thể đóng gói logic đó và tạo các tiện ích mở rộng tùy chỉnh của riêng bạn và trình bao bọc.

Điều đó nói rằng tôi cũng sẽ đề nghị xem qua thư viện tuyệt vời này có tên là SwiftDate. Ngay cả khi bạn không sử dụng nó, README đáng đọc. Nó giới thiệu định nghĩa hoặc Region có thể cực kỳ hữu ích cho một số trường hợp và một số trình khởi tạo tiện dụng.

Một số chất liệu mát mẻ và mẫu:

  • Math hoạt động với các ngày: (1.years - 2.hours + 16.minutes).fromNow()
  • thành phần thời gian Soạn: let dateInUTC = (2015.years | 12.months | 25.days | 20.hours | 10.minutes).inUTCRegion
  • Classy: let date = 5.days.fromNow, let date = 4.hours.ago
  • Với Regions: let date = (6.hours + 2.minutes).fromNow(region: inRome)
  • Và một nhiều hơn ...

Hy vọng điều đó sẽ hữu ích.

+0

Cảm ơn bạn đã chỉ cho tôi SwiftDate! – penner

19

Đây là một giải pháp cho Swift 4 - XCode 9

let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: Date()) 
+1

hãy thay thế 'NSCalendar' bằng' Lịch ' – zero3nna

Các vấn đề liên quan