Objective-C đặt NSDate thành UTC hiện tại


80

Có cách nào dễ dàng để NSDatekết hợp ngày / giờ UTC hiện tại không?


1
Sẽ [NSDate date]làm việc? Tôi không chắc đó có phải là UTC hay không.
zneak

2
Không có cái gọi là NSDateđược đặt thành UTC, nó không có múi giờ liên kết với nó.
Nick Forge

3
@MurraySagal Bạn không chính xác - NSDateđại diện cho một thời điểm tức thì (tên NSDatelà một cái gì đó nhầm lẫn). Khi mô tả một thời điểm chẳng hạn như "khoảnh khắc đầu tiên của ngày 1 tháng 1 năm 2001", bạn cần một múi giờ để tìm ra thời điểm chính xác mà bạn đang nói đến, nhưng khi NSDatenó được tạo, không có múi giờ nào được liên kết với nó.
Nick Forge

1
@NickForge Một NSDate được tạo là "thời điểm đầu tiên của ngày 1 tháng 1 năm 2001, GMT", một thời gian cụ thể trong một múi giờ cụ thể và thực tế đó là bất biến và cực kỳ quan trọng đối với lý do tại sao ngày tháng hoạt động như chúng. Nếu chúng tôi ở các múi giờ khác nhau và chúng tôi ghi lại điều này vào cùng một thời điểm, NSLog(@"since1970= %f", [[NSDate date] timeIntervalSince1970]);kết quả là giống nhau. Tại sao? Bởi vì nó liên quan đến một thời điểm cụ thể trong một múi giờ cụ thể (GMT), bất kể người dùng ở đâu. Thực tế là nó liên quan đến GMT không biến mất khi nó được tạo ra. Nếu không có neo này, ngày tháng sẽ là tùy ý.
Murray Sagal

2
@MurraySagal Cả hai bạn đều đúng theo những cách khác nhau, nhưng Nick đúng hơn khi nói "Không có cái gọi là NSDateđược đặt thành UTC", bởi vì bạn không thể đặt múi giờ của một NSDatevà bạn không chính xác khi nói điều đó nó "có một múi giờ". Đúng là nó được xác định liên quan đến một múi giờ cụ thể, nhưng nói rằng nó "có" một múi giờ ngụ ý rằng múi giờ là thuộc tính của NSDatevà điều đó không đúng.
devos1

Câu trả lời:


148

[NSDate date];

Bạn có thể muốn tạo một danh mục hoạt động như sau:

-(NSString *)getUTCFormateDate:(NSDate *)localDate
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    [dateFormatter setTimeZone:timeZone];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSString *dateString = [dateFormatter stringFromDate:localDate];
    [dateFormatter release];
    return dateString;
}

2
NSTimeZone * timeZone = [NSTimeZone timeZoneWithName: @ "UTC"]; [dateFormatter setTimeZone: timeZone]; điều đó đóng đinh nó cảm ơn
Brodie

1
nếu điều này đang chuyển sang giai đoạn sản xuất, bạn có thể thực sự muốn tạo một dateFormatter tĩnh được khởi tạo lười biếng. Việc tạo dateFormatter thực sự hơi tốn kém.
jessecurry 21/10/10

3
Tôi cần nó dưới dạng đối tượng ngày tháng không phải là chuỗi, tôi có thể làm gì trong trường hợp này?
Maystro

1
Ngày tồn tại độc lập với múi giờ, múi giờ chỉ được sử dụng để sản xuất đầu ra cho con người.
jessecurry

@jessecurry Không hoàn toàn đúng. Từ tham chiếu lớp NSDate: "Phương thức này trả về giá trị thời gian liên quan đến ngày tham chiếu tuyệt đối — thời điểm đầu tiên của ngày 1 tháng 1 năm 2001, GMT." Lưu ý tham chiếu rõ ràng và cụ thể đến GMT.
Murray Sagal,

13

NSDate là tham chiếu đến khoảng thời gian từ ngày tham chiếu tuyệt đối, ngày 1 tháng 1 năm 2001 00:00 GMT. Vì vậy, phương thức lớp [NSDate date] sẽ trả về một biểu diễn của khoảng thời gian đó. Để trình bày dữ liệu đó ở định dạng văn bản trong UTC, chỉ cần sử dụng NSDateFormatter với NSTimeZone (UTC) thích hợp để kết xuất khi cần thiết.


3
Tôi tin rằng [NSDate now] phải là [NSDate date] trong câu trả lời này.
foldlettuce vào

2

Các đối tượng NSDate đóng gói một thời điểm duy nhất, không phụ thuộc vào bất kỳ hệ thống lịch hoặc múi giờ cụ thể nào. Đối tượng ngày tháng là bất biến, đại diện cho khoảng thời gian bất biến so với ngày tham chiếu tuyệt đối (00:00:00 UTC vào ngày 1 tháng 1 năm 2001).

Phiên bản Swift:

extension NSDate {
    func getUTCFormateDate() -> String {
        let dateFormatter = NSDateFormatter()
        let timeZone = NSTimeZone(name: "UTC")
        dateFormatter.timeZone = timeZone
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        return dateFormatter.stringFromDate(self)
    }
}
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.