Chuyển đổi NSDate thành NSString


Câu trả lời:


468

Làm thế nào về...

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy"];

//Optionally for time zone conversions
[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"..."]];

NSString *stringFromDate = [formatter stringFromDate:myNSDateInstance];

//unless ARC is active
[formatter release];

Swift 4.2:

func stringFromDate(_ date: Date) -> String {
    let formatter = DateFormatter()
    formatter.dateFormat = "dd MMM yyyy HH:mm" //yyyy
    return formatter.string(from: date)
}

24
Điều này sẽ tạo ra rò rỉ bộ nhớ, vì bộ định dạng không bao giờ được phát hành.
mana

6
Đừng dùng initvới NSDateFormatter. Nó đã bị xóa sau iOS 3.2 . (Và nếu bạn sử dụng một phương thức lớp thay thế, nó sẽ tự động thoát và bạn cũng sẽ không gặp vấn đề rò rỉ.)
zekel

3
Thực sự đề nghị nhìn bên dưới tại localizedStringFromDate
Oded Ben Dov

4
@zekel Tôi không chắc tài liệu này dùng để nói gì, nhưng bây giờ nó gợi ý initở nhiều nơi.
Neal Ehardt

2
Tôi đã tự động phát hành nó (3 năm trước)
Adam Waite

283

Tôi không biết làm thế nào tất cả chúng ta đã bỏ lỡ điều này: localizedStringFromDate: dateStyle: timeStyle:

NSString *dateString = [NSDateFormatter localizedStringFromDate:[NSDate date] 
                                                      dateStyle:NSDateFormatterShortStyle 
                                                      timeStyle:NSDateFormatterFullStyle];
NSLog(@"%@",dateString);

đầu ra '13 / 06/12 00:22:39 GMT + 03: 00 '


một khi được viết ra một chuỗi, có cách nào gọn gàng để đọc nó như thế này không? (sử dụng các enum NSDateFormatter)
Fonix

@Fonix Tôi không nghĩ vậy - đây là một chuỗi được bản địa hóa, có nghĩa là nó phụ thuộc vào cài đặt ngôn ngữ của người dùng. Bạn không bao giờ nên lưu trữ ngày ở định dạng như thế này vì cài đặt có thể thay đổi bất cứ lúc nào.
Viktor Benei

Nó tốt đẹp nếu bạn sử dụng các định dạng hiếm. Nếu không, bạn cần một bộ đệm.
Mike Glukhov

Trong swift: let dateString = NSDateFormatter.localizedStringFromDate (ngày, dateStyle: .ShortStyle, timeStyle: .ullStyle);
Cristan

1
Giảm số lượng mã và nhờ hoạt động hoàn hảo
Preetha

87

Hy vọng sẽ tăng thêm giá trị bằng cách cung cấp định dạng thông thường bao gồm cả năm, tháng và ngày với thời gian. Bạn có thể sử dụng công cụ định dạng này trong hơn một năm

[dateFormat setDateFormat: @"yyyy-MM-dd HH:mm:ss zzz"]; 

24

Có một số NSDatengười trợ giúp trên web, tôi có xu hướng sử dụng:

https://github.com/billymeltdown/nsdate-rcper/

Trích xuất Readme dưới đây:

  NSString *displayString = [NSDate stringForDisplayFromDate:date];

Điều này tạo ra các loại đầu ra sau đây:

3:42 AM  if the date is after midnight today
Tuesday  if the date is within the last seven days
Mar 1  if the date is within the current calendar year
Mar 1, 2008  else ;-)

Đây chắc chắn là một giải pháp tuyệt vời. Đừng phải lãng phí thời gian để lo lắng về việc bạn muốn ngày của mình trông như thế nào và có thể tiếp tục với việc viết mã. :)
kyleturner

13

Trong Swift:

var formatter = NSDateFormatter()
formatter.dateFormat = "yyyy"
var dateString = formatter.stringFromDate(YourNSDateInstanceHERE)

Trong Swift 3.0, hãy để formatter = DateFormatter () formatter.dateFormat = "yyyy" return formatter.opes (từ: date)
Victor Laerte

8
  NSDateFormatter *dateformate=[[NSDateFormatter alloc]init];
  [dateformate setDateFormat:@"yyyy"]; // Date formater
  NSString *date = [dateformate stringFromDate:[NSDate date]]; // Convert date to string
  NSLog(@"date :%@",date);

1
"YYYY" đưa ra năm cho tuần hiện tại chứ không phải ngày. Sử dụng "yyyy" thay thế. Xem câu hỏi SO này để biết thêm. stackoverflow.com/questions/15133549/ Mạnh
Steve Moser

Cảm ơn Steve moser :)
SR Nayak

4

Nếu bạn không có NSDate -descriptionWithCalendarFormat:timeZone:locale:sẵn (tôi không tin iPhone / Ca cao cảm ứng bao gồm điều này), bạn có thể cần sử dụng strftime và khỉ xung quanh với một số chuỗi kiểu C. Bạn có thể lấy dấu thời gian UNIX từ việc NSDatesử dụng NSDate -timeIntervalSince1970.


4
+(NSString*)date2str:(NSDate*)myNSDateInstance onlyDate:(BOOL)onlyDate{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    if (onlyDate) {
        [formatter setDateFormat:@"yyyy-MM-dd"];
    }else{
        [formatter setDateFormat: @"yyyy-MM-dd HH:mm:ss"];
    }

    //Optionally for time zone conversions
    //   [formatter setTimeZone:[NSTimeZone timeZoneWithName:@"..."]];

    NSString *stringFromDate = [formatter stringFromDate:myNSDateInstance];
    return stringFromDate;
}

+(NSDate*)str2date:(NSString*)dateStr{
    if ([dateStr isKindOfClass:[NSDate class]]) {
        return (NSDate*)dateStr;
    }

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd"];
    NSDate *date = [dateFormat dateFromString:dateStr];
    return date;
}

3

Chỉ cần thêm phần mở rộng này:

extension NSDate {
    var stringValue: String {
        let formatter = NSDateFormatter()
        formatter.dateFormat = "yourDateFormat"
        return formatter.stringFromDate(self)
    }
}

2

Nếu bạn đang dùng Mac OS X, bạn có thể viết:

NSString* s = [[NSDate date] descriptionWithCalendarFormat:@"%Y_%m_%d_%H_%M_%S" timeZone:nil locale:nil];

Tuy nhiên điều này không có sẵn trên iOS.


1

nhanh chóng trả lời 4

static let dateformat: String = "yyyy-MM-dd'T'HH:mm:ss"
public static func stringTodate(strDate : String) -> Date
{

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = dateformat
    let date = dateFormatter.date(from: strDate)
    return date!
}
public static func dateToString(inputdate : Date) -> String
{

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = dateformat
    return formatter.string(from: inputdate)

}

0
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:myNSDateInstance];
NSInteger year = [components year];
// NSInteger month = [components month];
NSString *yearStr = [NSString stringWithFormat:@"%ld", year];

0

Xác định tiện ích của riêng bạn để định dạng định dạng ngày yêu cầu của bạn, ví dụ:

NSString * stringFromDate(NSDate *date)  
 {   NSDateFormatter *formatter
    [[NSDateFormatter alloc] init];  
    [formatter setDateFormat:@"MM ∕ dd ∕ yyyy, hh꞉mm a"];    
    return [formatter stringFromDate:date]; 
}

0

Đó là định dạng nhanh chóng:

func dateFormatterWithCalendar(calndarIdentifier: Calendar.Identifier, dateFormat: String) -> DateFormatter {

    let formatter = DateFormatter()
    formatter.calendar = Calendar(identifier: calndarIdentifier)
    formatter.dateFormat = dateFormat

    return formatter
}


//Usage
let date = Date()
let fotmatter = dateFormatterWithCalendar(calndarIdentifier: .gregorian, dateFormat: "yyyy")
let dateString = fotmatter.string(from: date)
print(dateString) //2018
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.