ฉันจะคำนวณความแตกต่างระหว่างวันที่สองวันได้อย่างไร


คำตอบ:


237
NSDate *date1 = [NSDate dateWithString:@"2010-01-01 00:00:00 +0000"];
NSDate *date2 = [NSDate dateWithString:@"2010-02-03 00:00:00 +0000"];

NSTimeInterval secondsBetween = [date2 timeIntervalSinceDate:date1];

int numberOfDays = secondsBetween / 86400;

NSLog(@"There are %d days in between the two dates.", numberOfDays);

แก้ไข:

จำไว้ว่าอNSDateอบเจ็กต์แสดงถึงช่วงเวลาที่แน่นอนโดยไม่มีข้อมูลโซนเวลาที่เกี่ยวข้อง เมื่อคุณแปลงสตริงวันที่โดยใช้ e กรัมNSDateFormatterที่NSDateFormatterแปลงเวลาจากเขตการกำหนดค่า ดังนั้นจำนวนวินาทีระหว่างสองNSDateวัตถุจะเสมอเป็นโซนเวลาไม่เชื่อเรื่องพระเจ้า

นอกจากนี้เอกสารนี้ยังระบุว่าการใช้เวลาของ Cocoa ไม่ได้คำนึงถึงวินาทีอธิกสุรทินดังนั้นหากคุณต้องการความถูกต้องดังกล่าวคุณจะต้องม้วนการใช้งานของคุณเอง


5
@RalucaGurau: 86400 คือจำนวนวินาทีในหนึ่งวัน (เช่น 60 วินาทีคูณ 60 นาทีคูณ 24 ชั่วโมง) มันไม่มีประโยชน์อะไรกับเดือน
dreamlax

18
ไม่ใช่ทุกวันที่มี 86400 วินาที สำหรับตัวอย่างเล็ก ๆ น้อย ๆ นั้นดี แต่ไม่ใช่ความคิดที่ดีในโลกแห่งความเป็นจริง การเปลี่ยนแปลง DST อธิกวินาทีและอื่น ๆ ทั้งหมดสามารถยุ่งกับมันได้ NSCalendar สามารถบอกคุณได้ว่ามีกี่วินาทีในหนึ่งวัน
NeilInglis

2
@muthukumar: ไม่ใช่บน iOS วิธีนี้ใช้ได้เฉพาะบน Mac OS X คำถามนี้ถูกแท็กcocoaและไม่ใช่cocoa-touchคำตอบนี้จึงใช้ได้กับ Mac OS X เท่านั้น
dreamlax

1
จำนวนวันระหว่างสองช่วงเวลาใดเวลาหนึ่งจะเท่ากับ 86400 เสมอไม่ว่ามนุษย์จะอยู่ในขั้นหลอกตัวเองให้ตื่นเร็วกว่าปกติหนึ่งชั่วโมงหรือไม่ก็ไม่ต่างอะไรกับความจริงที่ว่าวันนั้นยาว 86400 วินาที (ไม่สนใจการก้าวกระโดด วินาที)
dreamlax

1
เพียงแค่ต้องการเพิ่มว่าถ้าคุณไม่มี +0000 นั้นในตอนท้ายคุณจะได้รับวันที่ว่างและค่า 0 เสมอไม่ว่าจะเป็นอย่างไร ดังนั้นอย่าตกหลุมพรางนั้น
Volomike

84

คุณอาจต้องการใช้สิ่งนี้:

NSDateComponents *components;
NSInteger days;

components = [[NSCalendar currentCalendar] components: NSDayCalendarUnit 
        fromDate: startDate toDate: endDate options: 0];
days = [components day];

ฉันเชื่อว่าวิธีนี้อธิบายถึงสถานการณ์ต่างๆเช่นวันที่ที่มีการเปลี่ยนแปลงของการออมแสง


2
มีวิธีง่ายๆในการเพิกเฉยต่อเวลาของวันที่ที่กำหนดหรือไม่?
Mihai Timar

สามารถเปลี่ยนแปลงได้ตามหน่วยปฏิทินอื่น ๆ :) ใช้สำหรับหน่วยปี
เทคโนโลยีรอบรู้

NSDateออบเจ็กต์ไม่เชื่อเรื่องพระเจ้าอยู่แล้ว ข้อมูลโซนเวลาจะถูกลบออกเมื่อแยกวิเคราะห์วันที่ด้วยเช่นNSDateFormatterเพื่อให้NSDateวัตถุแสดงช่วงเวลาที่แน่นอนในเวลา ดังนั้นหากคุณมีstartDateและendDateวัตถุทั้งสองนี้จะห่างกันxจำนวนวินาที โซนเวลาจะไม่เกี่ยวข้องกับมัน
dreamlax

@ เบนจามิน: ทำไมถึงพูดแบบนั้น?
dreamlax

dreamlax คำตอบของคุณผิด เรียบง่าย. คำนวณจำนวนวันระหว่าง 12 เที่ยงวันเวลามาตรฐาน 1 มกราคมและ 12 เที่ยงวัน 1 เมษายนและสูตรของคุณใช้ไม่ได้ เป็นสูตรที่น่าเกียจและนักพัฒนาควรใช้วัตถุ NSDateComponents เพื่อคำนวณสิ่งนี้
Rickster

25
NSTimeInterval diff = [date2 timeIntervalSinceDate:date1]; // in seconds

ที่ไหนdate1และdate2อยู่NSDateที่ไหน

นอกจากนี้โปรดสังเกตคำจำกัดความของNSTimeInterval:

typedef double NSTimeInterval;

โปรดทราบว่า NSTimeInterval เป็นสองเท่าดังนั้นคุณสามารถใช้มันเหมือนกับหมายเลขอื่น ๆ
Kendall Helmstetter Gelner

19

ชำระเงินนี้ ดูแลการออมแสงตามฤดูกาลปีอธิกสุรทินตามที่ใช้ปฏิทิน iOS ในการคำนวณคุณสามารถเปลี่ยนสตริงและเงื่อนไขเพื่อรวมนาทีพร้อมชั่วโมงและวันได้

+(NSString*)remaningTime:(NSDate*)startDate endDate:(NSDate*)endDate
{
    NSDateComponents *components;
    NSInteger days;
    NSInteger hour;
    NSInteger minutes;
    NSString *durationString;

    components = [[NSCalendar currentCalendar] components: NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute fromDate: startDate toDate: endDate options: 0];

    days = [components day];
    hour = [components hour];
    minutes = [components minute];

    if(days>0)
    {
        if(days>1)
            durationString=[NSString stringWithFormat:@"%d days",days];
        else
            durationString=[NSString stringWithFormat:@"%d day",days];
        return durationString;
    }
    if(hour>0)
    {        
        if(hour>1)
            durationString=[NSString stringWithFormat:@"%d hours",hour];
        else
            durationString=[NSString stringWithFormat:@"%d hour",hour];
        return durationString;
    }
    if(minutes>0)
    {
        if(minutes>1)
            durationString = [NSString stringWithFormat:@"%d minutes",minutes];
        else
            durationString = [NSString stringWithFormat:@"%d minute",minutes];

        return durationString;
    }
    return @""; 
}

วิธีนี้เป็นวิธีคำนวณความแตกต่างของเวลาที่สมบูรณ์แบบ
Moxarth

เพียงแค่คุณสามารถรักษาสิ่งอื่น ๆ ได้หากมีเงื่อนไขเหล่านี้ทั้งหมด มิฉะนั้นคุณจะแสดงเวลาเพียงรูปแบบเดียว
Moxarth

3

ด้วย Swift 5 และ iOS 12 ตามความต้องการของคุณคุณสามารถใช้หนึ่งในสองวิธีต่อไปนี้เพื่อค้นหาความแตกต่างระหว่างวันที่สองวันในแต่ละวัน


# 1 ใช้Calendar's dateComponents(_:from:to:)วิธี

import Foundation

let calendar = Calendar.current

let startDate = calendar.date(from: DateComponents(year: 2010, month: 11, day: 22))!
let endDate = calendar.date(from: DateComponents(year: 2015, month: 5, day: 1))!

let dateComponents = calendar.dateComponents([Calendar.Component.day], from: startDate, to: endDate)

print(dateComponents) // prints: day: 1621 isLeapMonth: false
print(String(describing: dateComponents.day)) // prints: Optional(1621)

# 2 ใช้DateComponentsFormatter's string(from:to:)วิธี

import Foundation

let calendar = Calendar.current

let startDate = calendar.date(from: DateComponents(year: 2010, month: 11, day: 22))!
let endDate = calendar.date(from: DateComponents(year: 2015, month: 5, day: 1))!

let formatter = DateComponentsFormatter()
formatter.unitsStyle = .full
formatter.allowedUnits = [NSCalendar.Unit.day]

let elapsedTime = formatter.string(from: startDate, to: endDate)
print(String(describing: elapsedTime)) // prints: Optional("1,621 days")

1

Swift 4
ลองใช้และดู (ช่วงวันที่ที่มี String):

// Start & End date string
let startingAt = "01/01/2018"
let endingAt = "08/03/2018"

// Sample date formatter
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd/MM/yyyy"

// start and end date object from string dates
var startDate = dateFormatter.date(from: startingAt) ?? Date()
let endDate = dateFormatter.date(from: endingAt) ?? Date()


// Actual operational logic
var dateRange: [String] = []
while startDate <= endDate {
    let stringDate = dateFormatter.string(from: startDate)
    startDate = Calendar.current.date(byAdding: .day, value: 1, to: startDate) ?? Date()
    dateRange.append(stringDate)
}

print("Resulting Array - \(dateRange)")

สวิฟต์ 3

var date1 = Date(string: "2010-01-01 00:00:00 +0000")
var date2 = Date(string: "2010-02-03 00:00:00 +0000")
var secondsBetween: TimeInterval = date2.timeIntervalSince(date1)
var numberOfDays: Int = secondsBetween / 86400
print(numberOfDays)

ไม่ใช่ทุกวันที่มีจำนวนวินาทีนั้น
Pavan

@Pavan - คุณยินดีที่จะแบ่งปันข้อมูลของคุณโดยการอัปเดตคำตอบนี้และทำให้ดีขึ้น
Krunal

เพื่อให้ดีขึ้นจะต้องให้ฉันเขียนคำตอบทั้งหมดของคุณใหม่ซึ่งในกรณีนี้อาจถูกลบเช่นกันเพราะจะเป็นคำตอบเดียวกับคำตอบด้านบนที่ไม่ใช้ค่าฮาร์ดโค้ด :)
Pavan

0

คุณสามารถค้นหาความแตกต่างได้โดยการแปลงวันที่เป็นวินาทีและใช้ช่วงเวลาตั้งแต่ปี 1970 จากนั้นคุณจะพบความแตกต่างระหว่างวันที่สองวัน


เมื่อสามารถคำนวณวันที่สองวันซึ่งกันและกันได้โดยตรง (สมมติว่าโดเมนเวลาเดียวกัน) มีเหตุผลเฉพาะในการคำนวณวันที่ทั้งสองตั้งแต่ปี 1970 ก่อนแล้วจึงพบความแตกต่างหรือไม่?
Adeel

0

ในการค้นหาความแตกต่างคุณต้องได้รับวันที่ปัจจุบันและวันที่ในอนาคต ในกรณีต่อไปนี้ฉันใช้ 2 วันเพื่อเป็นตัวอย่างของวันที่ในอนาคต คำนวณโดย:

2 days* 24 hours* 60 minutes* 60 seconds. เราคาดว่าจำนวนวินาทีใน 2 วันจะเป็น 172,800

// Set the current and future date
let now = Date()
let nowPlus2Days = Date(timeInterval: 2*24*60*60, since: now)

// Get the number of seconds between these two dates
let secondsInterval = DateInterval(start: now, end: nowPlus2Days).duration

print(secondsInterval) // 172800.0

1
โปรดอย่าโพสต์โค้ดเพื่อเป็นคำตอบเท่านั้น แต่ให้อธิบายด้วยว่าโค้ดของคุณทำหน้าที่อะไรและจะแก้ปัญหาของคำถามได้อย่างไร คำตอบที่มีคำอธิบายมักจะมีคุณภาพสูงกว่าและมีแนวโน้มที่จะดึงดูดการโหวตได้มากกว่า
Mark Rotteveel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.