मुझे आश्चर्य हो रहा है कि क्या स्विफ्ट / "नई" कोको में दो एनएसडी के बीच दिनों की राशि प्राप्त करने के लिए कुछ नया और भयानक संभावना है?
जैसे मैं रूबी में करूँगा:
(end_date - start_date).to_i
मुझे आश्चर्य हो रहा है कि क्या स्विफ्ट / "नई" कोको में दो एनएसडी के बीच दिनों की राशि प्राप्त करने के लिए कुछ नया और भयानक संभावना है?
जैसे मैं रूबी में करूँगा:
(end_date - start_date).to_i
जवाबों:
आपको समय के अंतर पर भी विचार करना होगा। उदाहरण के लिए यदि आप तारीखों की तुलना करते हैं2015-01-01 10:00
और 2015-01-02 09:00
, उन तारीखों के बीच के दिन 0 (शून्य) के रूप में वापस आ जाएंगे क्योंकि उन तारीखों के बीच का अंतर 24 घंटे से कम है (यह 23 घंटे है)।
यदि आपका उद्देश्य दो तिथियों के बीच सटीक दिन संख्या प्राप्त करना है, तो आप इस तरह से इस मुद्दे पर काम कर सकते हैं:
// Assuming that firstDate and secondDate are defined
// ...
let calendar = NSCalendar.currentCalendar()
// Replace the hour (time) of both dates with 00:00
let date1 = calendar.startOfDayForDate(firstDate)
let date2 = calendar.startOfDayForDate(secondDate)
let flags = NSCalendarUnit.Day
let components = calendar.components(flags, fromDate: date1, toDate: date2, options: [])
components.day // This will return the number of day(s) between dates
let calendar = Calendar.current
// Replace the hour (time) of both dates with 00:00
let date1 = calendar.startOfDay(for: firstDate)
let date2 = calendar.startOfDay(for: secondDate)
let components = calendar.dateComponents([.day], from: date1, to: date2)
calendar.date(bySettingHour: 12, minute: 00, second: 00, of: calendar.startOfDay(for: firstDate))
startOfDay()
अनावश्यक प्रतीत होता है) calendar.date(bySettingHour: 12, minute: 0, second: 0, of: firstDate)
:।
यहाँ स्विफ्ट 2 के लिए मेरा जवाब है:
func daysBetweenDates(startDate: NSDate, endDate: NSDate) -> Int
{
let calendar = NSCalendar.currentCalendar()
let components = calendar.components([.Day], fromDate: startDate, toDate: endDate, options: [])
return components.day
}
today
औरtomorrow
मैं एक जोड़ी Swift3 जवाब देखता हूं तो मैं अपना खुद का जोड़ दूंगा:
public static func daysBetween(start: Date, end: Date) -> Int {
Calendar.current.dateComponents([.day], from: start, to: end).day!
}
नामकरण अधिक स्विफ्टी महसूस करता है, यह एक पंक्ति है, और नवीनतम dateComponents()
विधि का उपयोग कर रहा है ।
मैंने अपने उद्देश्य-सी उत्तर का अनुवाद किया
let start = "2010-09-01"
let end = "2010-09-05"
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let startDate:NSDate = dateFormatter.dateFromString(start)
let endDate:NSDate = dateFormatter.dateFromString(end)
let cal = NSCalendar.currentCalendar()
let unit:NSCalendarUnit = .Day
let components = cal.components(unit, fromDate: startDate, toDate: endDate, options: nil)
println(components)
परिणाम
<NSDateComponents: 0x10280a8a0>
Day: 4
सबसे कठिन हिस्सा यह था कि ऑटोकंप्लीशन डीटेट और टॉड से प्रेरित है NSDate?
, लेकिन वास्तव में उन्हें NSDate!
संदर्भ में दिखाया जाना चाहिए ।
मैं नहीं देखता कि एक ऑपरेटर के साथ एक अच्छा समाधान कैसा दिखेगा, जैसा कि आप प्रत्येक मामले में इकाई को अलग-अलग निर्दिष्ट करना चाहते हैं। आप समय अंतराल को वापस कर सकते हैं, लेकिन इससे ज्यादा आप हासिल नहीं करेंगे।
.DayCalendarUnit
पदावनत कर दिया गया है। मेरा मानना है कि अब आपको .CalendarUnitDay
इसके बजाय उपयोग करना चाहिए ।
let components = cal.components(.Day, fromDate: startDate, toDate: endDate, options: [])
.Day
अभी
यहाँ बहुत अच्छा है, Date
साल, महीने, दिन, घंटे, मिनट, सेकंड में तारीखों के बीच अंतर पाने के लिए विस्तार
extension Date {
func years(sinceDate: Date) -> Int? {
return Calendar.current.dateComponents([.year], from: sinceDate, to: self).year
}
func months(sinceDate: Date) -> Int? {
return Calendar.current.dateComponents([.month], from: sinceDate, to: self).month
}
func days(sinceDate: Date) -> Int? {
return Calendar.current.dateComponents([.day], from: sinceDate, to: self).day
}
func hours(sinceDate: Date) -> Int? {
return Calendar.current.dateComponents([.hour], from: sinceDate, to: self).hour
}
func minutes(sinceDate: Date) -> Int? {
return Calendar.current.dateComponents([.minute], from: sinceDate, to: self).minute
}
func seconds(sinceDate: Date) -> Int? {
return Calendar.current.dateComponents([.second], from: sinceDate, to: self).second
}
}
date
sinceDate
फ़ंक्शन मापदंडों में होना चाहिए ।
days
और यह ठीक काम करता है।
func years(since date: Date) -> Int? { return Calendar.current.dateComponents[.year], from: date, to: self).years }
, और आप इसे कॉल कर सकते हैं let y = date1.years(since: date2)
। यह आधुनिक नामकरण सम्मेलनों के साथ अधिक सुसंगत हो सकता है।
स्विफ्ट 3 iOS 10 बीटा 4 के लिए अपडेट
func daysBetweenDates(startDate: Date, endDate: Date) -> Int {
let calendar = Calendar.current
let components = calendar.dateComponents([Calendar.Component.day], from: startDate, to: endDate)
return components.day!
}
यहाँ स्विफ्ट 3 के लिए जवाब है (IOS 10 बीटा के लिए परीक्षण)
func daysBetweenDates(startDate: Date, endDate: Date) -> Int
{
let calendar = Calendar.current
let components = calendar.components([.day], from: startDate, to: endDate, options: [])
return components.day!
}
तब आप इसे इस तरह कह सकते हैं
let pickedDate: Date = sender.date
let NumOfDays: Int = daysBetweenDates(startDate: pickedDate, endDate: Date())
print("Num of Days: \(NumOfDays)")
स्विफ्ट 3. सुझाव के लिए ऊपर एमिन बुआरा सारल को धन्यवाद startOfDay
।
extension Date {
func daysBetween(date: Date) -> Int {
return Date.daysBetween(start: self, end: date)
}
static func daysBetween(start: Date, end: Date) -> Int {
let calendar = Calendar.current
// Replace the hour (time) of both dates with 00:00
let date1 = calendar.startOfDay(for: start)
let date2 = calendar.startOfDay(for: end)
let a = calendar.dateComponents([.day], from: date1, to: date2)
return a.value(for: .day)!
}
}
उपयोग:
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let start = dateFormatter.date(from: "2017-01-01")!
let end = dateFormatter.date(from: "2018-01-01")!
let diff = Date.daysBetween(start: start, end: end) // 365
स्विफ्ट में निर्मित चीजें अभी भी बहुत बुनियादी हैं। जैसा कि वे इस प्रारंभिक चरण में होना चाहिए। लेकिन आप ओवरलोडिंग ऑपरेटरों और वैश्विक डोमेन कार्यों के साथ आने वाले जोखिम के साथ अपना खुद का सामान जोड़ सकते हैं। वे हालांकि आपके मॉड्यूल के लिए स्थानीय होंगे।
let now = NSDate()
let seventies = NSDate(timeIntervalSince1970: 0)
// Standard solution still works
let days = NSCalendar.currentCalendar().components(.CalendarUnitDay,
fromDate: seventies, toDate: now, options: nil).day
// Flashy swift... maybe...
func -(lhs:NSDate, rhs:NSDate) -> DateRange {
return DateRange(startDate: rhs, endDate: lhs)
}
class DateRange {
let startDate:NSDate
let endDate:NSDate
var calendar = NSCalendar.currentCalendar()
var days: Int {
return calendar.components(.CalendarUnitDay,
fromDate: startDate, toDate: endDate, options: nil).day
}
var months: Int {
return calendar.components(.CalendarUnitMonth,
fromDate: startDate, toDate: endDate, options: nil).month
}
init(startDate:NSDate, endDate:NSDate) {
self.startDate = startDate
self.endDate = endDate
}
}
// Now you can do this...
(now - seventies).months
(now - seventies).days
यहाँ स्विफ्ट 3 के लिए मेरा जवाब है:
func daysBetweenDates(startDate: NSDate, endDate: NSDate, inTimeZone timeZone: TimeZone? = nil) -> Int {
var calendar = Calendar.current
if let timeZone = timeZone {
calendar.timeZone = timeZone
}
let dateComponents = calendar.dateComponents([.day], from: startDate.startOfDay, to: endDate.startOfDay)
return dateComponents.day!
}
अभी तक शायद ही कोई स्विफ्ट-विशिष्ट मानक पुस्तकालय है; सिर्फ दुबला बुनियादी संख्यात्मक, स्ट्रिंग, और संग्रह प्रकार।
एक्सटेंशन का उपयोग करके ऐसे शॉर्टहैंड्स को परिभाषित करना पूरी तरह से संभव है, लेकिन जहां तक वास्तविक आउट-ऑफ-द-बॉक्स एपीआई जाने का है, तो कोई "नया" कोको नहीं है; स्विफ्ट को सीधे उसी पुरानी क्रिया कोको एपीआई में मैप करें जैसे वे पहले से मौजूद हैं।
मैं अपना संस्करण जोड़ने जा रहा हूं, भले ही यह धागा एक साल पुराना हो। मेरा कोड इस तरह दिखता है:
var name = txtName.stringValue // Get the users name
// Get the date components from the window controls
var dateComponents = NSDateComponents()
dateComponents.day = txtDOBDay.integerValue
dateComponents.month = txtDOBMonth.integerValue
dateComponents.year = txtDOBYear.integerValue
// Make a Gregorian calendar
let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)
// Get the two dates we need
var birthdate = calendar?.dateFromComponents(dateComponents)
let currentDate = NSDate()
var durationDateComponents = calendar?.components(NSCalendarUnit.CalendarUnitDay, fromDate: birthdate!, toDate: currentDate, options: nil)
let numberOfDaysAlive = durationDateComponents?.day
println("\(numberOfDaysAlive!)")
txtGreeting.stringValue = "Hello \(name), You have been alive for \(numberOfDaysAlive!) days."
मुझे उम्मीद है कि यह किसी की मदद करता है।
चीयर्स,
आयलैंड की विधि स्विफ्ट 3 में अपडेट की गई, यह आज से दिन दिखाता है (दिन के समय की उपेक्षा)
func daysBetweenDates( endDate: Date) -> Int
let calendar: Calendar = Calendar.current
let date1 = calendar.startOfDay(for: Date())
let date2 = calendar.startOfDay(for: secondDate)
return calendar.dateComponents([.day], from: date1, to: date2).day!
}
आप निम्नलिखित एक्सटेंशन का उपयोग कर सकते हैं:
public extension Date {
func daysTo(_ date: Date) -> Int? {
let calendar = Calendar.current
// Replace the hour (time) of both dates with 00:00
let date1 = calendar.startOfDay(for: self)
let date2 = calendar.startOfDay(for: date)
let components = calendar.dateComponents([.day], from: date1, to: date2)
return components.day // This will return the number of day(s) between dates
}
}
फिर, आप इसे इस तरह से कॉल कर सकते हैं:
startDate.daysTo(endDate)
सभी का जवाब अच्छा है। लेकिन स्थानीयकरणों के लिए हमें दो तिथियों के बीच कई दशमलव दिनों की गणना करनी होगी। इसलिए हम स्थायी दशमलव प्रारूप प्रदान कर सकते हैं।
// This method returns the fractional number of days between to dates
func getFractionalDaysBetweenDates(date1: Date, date2: Date) -> Double {
let components = Calendar.current.dateComponents([.day, .hour], from: date1, to: date2)
var decimalDays = Double(components.day!)
decimalDays += Double(components.hour!) / 24.0
return decimalDays
}
extension Date {
func daysFromToday() -> Int {
return Calendar.current.dateComponents([.day], from: self, to: Date()).day!
}
}
फिर इसका उपयोग करें
func dayCount(dateString: String) -> String{
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMM dd,yyyy hh:mm a"
let fetchedDate = dateFormatter.date(from: dateString)
let day = fetchedDate?.daysFromToday()
if day! > -1{
return "\(day!) days passed."
}else{
return "\(day! * -1) days left."
}
}
स्विफ्ट 3 - आज से आज तक दिन
func daysUntilDate(endDateComponents: DateComponents) -> Int
{
let cal = Calendar.current
var components = cal.dateComponents([.era, .year, .month, .day], from: NSDate() as Date)
let today = cal.date(from: components)
let otherDate = cal.date(from: endDateComponents)
components = cal.dateComponents([Calendar.Component.day], from: (today! as Date), to: otherDate!)
return components.day!
}
इस तरह कॉल फंक्शन
// Days from today until date
var examnDate = DateComponents()
examnDate.year = 2016
examnDate.month = 12
examnDate.day = 15
let daysCount = daysUntilDate(endDateComponents: examnDate)
डेट पर एक्सटेंशन बनाना आसान विकल्प होगा
public extension Date {
public var currentCalendar: Calendar {
return Calendar.autoupdatingCurrent
}
public func daysBetween(_ date: Date) -> Int {
let components = currentCalendar.dateComponents([.day], from: self, to: date)
return components.day!
}
}
func completeOffset(from date:Date) -> String? {
let formatter = DateComponentsFormatter()
formatter.unitsStyle = .brief
return formatter.string(from: Calendar.current.dateComponents([.year,.month,.day,.hour,.minute,.second], from: date, to: self))
}
यदि आपको वर्ष के दिनों और घंटों की आवश्यकता है, तो स्ट्रिंग का उपयोग करें
var कल = Calendar.current.date (byAdding: .day, value: 1, to: Date ())!
let dc = काल .comOffset (से: दिनांक)
स्विफ्ट 4
func getDateHeader(indexPath: Int) -> String {
let formatter2 = DateFormatter()
formatter2.dateFormat = "MM-dd-yyyy"
var dateDeadline : Date?
dateDeadline = formatter2.date(from: arrCompletedDate[indexPath] as! String)
let currentTime = dateDeadline?.unixTimestamp
let calendar = NSCalendar.current
let date = NSDate(timeIntervalSince1970: Double(currentTime!))
if calendar.isDateInYesterday(date as Date) { return "Yesterday" }
else if calendar.isDateInToday(date as Date) { return "Today" }
else if calendar.isDateInTomorrow(date as Date) { return "Tomorrow" }
else {
let startOfNow = calendar.startOfDay(for: NSDate() as Date)
let startOfTimeStamp = calendar.startOfDay(for: date as Date)
let components = calendar.dateComponents([.day], from: startOfNow, to: startOfTimeStamp)
let day = components.day!
if day < 1 { return "\(abs(day)) days ago" }
else { return "In \(day) days" }
}
}
यह स्विफ्ट 5 के लिए एमिन के जवाब का एक अद्यतन संस्करण है जिसमें दिनों की तुलना करने के लिए निश्चित समय के रूप में आधी रात के बजाय दोपहर का उपयोग करने का सुझाव शामिल है। यह वैकल्पिक लौटकर विभिन्न तिथि कार्यों की संभावित विफलता को भी संभालता है।
///
/// This is an approximation; it does not account for time differences. It will set the time to 1200 (noon) and provide the absolute number
/// of days between now and the given date. If the result is negative, it should be read as "days ago" instead of "days from today."
/// Returns nil if something goes wrong initializing or adjusting dates.
///
func daysFromToday() -> Int?
{
let calendar = NSCalendar.current
// Replace the hour (time) of both dates with noon. (Noon is less likely to be affected by DST changes, timezones, etc. than midnight.)
guard let date1 = calendar.date(bySettingHour: 12, minute: 00, second: 00, of: calendar.startOfDay(for: Date())),
let date2 = calendar.date(bySettingHour: 12, minute: 00, second: 00, of: calendar.startOfDay(for: self)) else
{
return nil
}
return calendar.dateComponents([.day], from: date1, to: date2).day
}
स्विफ्ट 5.2.4 समाधान:
import UIKit
let calendar = Calendar.current
let start = "2010-09-01"
let end = "2010-09-05"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let firstDate = dateFormatter.date(from: start)!
let secondDate = dateFormatter.date(from: end)!
// Replace the hour (time) of both dates with 00:00
let date1 = calendar.startOfDay(for: firstDate)
let date2 = calendar.startOfDay(for: secondDate)
let components = calendar.dateComponents([Calendar.Component.day], from: date1, to: date2)
components.day // This will return the number of day(s) between dates
func simpleIndex(ofDate: Date) -> Int {
// index here just means today 0, yesterday -1, tomorrow 1 etc.
let c = Calendar.current
let todayRightNow = Date()
let d = c.date(bySetting: .hour, value: 13, of: ofDate)
let t = c.date(bySetting: .hour, value: 13, of: todayRightNow)
if d == nil || today == nil {
print("weird problem simpleIndex#ofDate")
return 0
}
let r = c.dateComponents([.day], from: today!, to: d!)
// yesterday is negative one, tomorrow is one
if let o = r.value(for: .day) {
return o
}
else {
print("another weird problem simpleIndex#ofDate")
return 0
}
}
let calendar = NSCalendar.currentCalendar();
let component1 = calendar.component(.Day, fromDate: fromDate)
let component2 = calendar.component(.Day, fromDate: toDate)
let difference = component1 - component2