Làm cách nào để tính toán sự khác biệt giữa hai ngày?


Câu trả lời:


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);

BIÊN TẬP:

Hãy nhớ rằng, NSDatecác đối tượng đại diện cho các khoảnh khắc thời gian chính xác, chúng không có bất kỳ thông tin múi giờ liên quan nào. Khi bạn chuyển đổi một chuỗi thành một ngày bằng cách sử dụng ví dụ: an NSDateFormatter, thì sẽ NSDateFormatterchuyển đổi thời gian từ múi giờ đã định cấu hình. Do đó, số giây giữa hai NSDateđối tượng sẽ luôn là múi giờ bất khả tri.

Hơn nữa, tài liệu này chỉ định rằng thời gian triển khai của Cocoa không tính đến giây nhuận, vì vậy nếu bạn yêu cầu độ chính xác như vậy, bạn sẽ cần phải tự triển khai.


5
@RalucaGurau: 86400 là số giây trong một ngày (tức là 60 giây, nhân với 60 phút, 24 giờ). Nó không liên quan gì đến tháng.
dreamlax

18
Không phải tất cả các ngày đều có 86400 giây. Đối với một ví dụ nhỏ thì tốt nhưng nó không phải là một ý tưởng hay trong thế giới thực. Các thay đổi DST, giây nhảy vọt, v.v. đều có thể gây rối với nó. NSCalendar có thể cho bạn biết bao nhiêu giây trong một ngày nhất định.
NeilInglis

2
@muthukumar: Không trên iOS, phương pháp này chỉ có sẵn trên Mac OS X. Câu hỏi này được gắn thẻ cocoavà không cocoa-touchnên câu trả lời này chỉ áp dụng cho Mac OS X.
dreamlax

1
Số ngày giữa hai thời điểm bất kỳ sẽ luôn là 86400. Cho dù con người đang trong giai đoạn đánh lừa bản thân để thức dậy sớm hơn bình thường một giờ hay không cũng không có gì khác biệt so với thực tế là một ngày dài 86400 giây (bỏ qua bước nhảy vọt giây)
dreamlax

1
Chỉ muốn nói thêm rằng nếu cuối cùng bạn không có +0000 đó, bạn sẽ nhận được ngày tháng rỗng và giá trị 0 luôn ở mức khác, bất kể điều gì. Vì vậy, đừng rơi vào cái bẫy đó.
Volomike

84

Bạn có thể muốn sử dụng một cái gì đó như thế này:

NSDateComponents *components;
NSInteger days;

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

Tôi tin rằng phương pháp này giải thích cho các tình huống chẳng hạn như các ngày kéo dài sự thay đổi trong tiết kiệm ánh sáng ban ngày.


2
có cách nào đơn giản để bỏ qua thời gian cho những ngày đã cho không?
Mihai Timar

có thể được thay đổi tương ứng cho các đơn vị lịch khác :) được sử dụng cho đơn vị Năm.
hiểu biết về công nghệ

NSDatecác đối tượng đã là bất khả tri về múi giờ. Thông tin múi giờ bị xóa khi phân tích cú pháp ngày với ví dụ NSDateFormatter, để NSDatecác đối tượng đại diện cho các thời điểm chính xác. Do đó, nếu bạn đã có startDateendDate, hai đối tượng này sẽ cách nhau x số giây. Múi giờ sẽ không liên quan gì đến nó.
dreamlax

@Benjamin: Tại sao bạn lại nói vậy?
dreamlax

dreamlax, câu trả lời của bạn là sai. Thông thường và đơn giản. Tính số ngày từ 12 giờ trưa ngày 1 tháng 1 theo giờ chuẩn đến 12 giờ trưa ngày 1 tháng 4 theo giờ ban ngày và công thức của bạn không hoạt động. Đây là một công thức lười biếng và các nhà phát triển nên sử dụng đối tượng NSDateComponents để tính toán điều này.
Rickster

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

ở đâu date1date2đang ở đâu NSDate.

Ngoài ra, hãy lưu ý định nghĩa của NSTimeInterval:

typedef double NSTimeInterval;

Lưu ý rằng NSTimeInterval thực sự là một số kép, vì vậy bạn có thể sử dụng nó như bất kỳ số nào khác.
Kendall Helmstetter Gelner

19

Kiểm tra này ra. Nó quan tâm đến việc tiết kiệm ánh sáng ban ngày, năm nhuận vì nó đã sử dụng lịch iOS để tính toán. Bạn có thể thay đổi chuỗi và điều kiện để bao gồm phút với giờ và ngày.

+(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 @""; 
}

phương pháp này là cách hoàn hảo để tính chênh lệch thời gian.
Moxarth

chỉ cần bạn có thể giữ elseif với tất cả những điều kiện if. nếu không, bạn sẽ chỉ nhận được một định dạng thời gian hiển thị.
Moxarth

3

Với Swift 5 và iOS 12, tùy theo nhu cầu của bạn, bạn có thể sử dụng một trong hai cách sau để tìm sự khác biệt giữa hai ngày tính theo ngày.


# 1. Sử dụng Calendar's dateComponents(_:from:to:)phương pháp

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. Sử dụng DateComponentsFormatter's string(from:to:)phương pháp

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
Hãy thử điều này và xem (phạm vi ngày với Chuỗi):

// 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)")

Swift 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)

Không phải ngày nào cũng có số giây đó.
Pavan

@Pavan - Bạn được hoan nghênh chia sẻ thông tin đầu vào của mình bằng cách cập nhật câu trả lời này và cải thiện câu trả lời.
Krunal

Để làm cho nó tốt hơn sẽ yêu cầu tôi viết lại toàn bộ câu trả lời của bạn, trong trường hợp nó có thể cũng bị xóa bởi vì nó sẽ là giải pháp tương tự như các câu trả lời ở trên mà không sử dụng các giá trị hardcoded :)
Pavan

0

Bạn có thể tìm thấy sự khác biệt bằng cách chuyển đổi ngày theo giây và mất khoảng thời gian kể từ năm 1970 cho việc này và sau đó bạn có thể tìm thấy sự khác biệt giữa hai ngày.


khi hai ngày có thể được tính trực tiếp với nhau (giả sử cùng một miền thời gian). Có lý do cụ thể nào của việc tính toán cả hai ngày kể từ năm 1970 đầu tiên và sau đó tìm ra sự khác biệt không?
Adeel

0

Để tìm ra sự khác biệt, bạn cần lấy ngày hiện tại và ngày trong tương lai. Trong trường hợp sau, tôi đã sử dụng 2 ngày để làm ví dụ về ngày trong tương lai. Được tính toán bởi:

2 days* 24 hours* 60 minutes* 60 seconds. Chúng tôi dự đoán số giây trong 2 ngày là 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
Vui lòng không chỉ đăng mã như một câu trả lời, mà hãy cung cấp giải thích mã của bạn làm gì và cách nó giải quyết vấn đề của câu hỏi. Các câu trả lời kèm theo lời giải thích thường có chất lượng cao hơn và có nhiều khả năng thu hút sự ủng hộ hơn.
Mark Rotteveel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.