Konversi NSDate ke NSString

252

Bagaimana cara mengubah, NSDateuntuk NSStringsehingga hanya tahun di @ "yyyy" format output ke string?

4thSpace
sumber

Jawaban:

468

Bagaimana tentang...

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)
}
Allan
sumber
24
Ini akan menghasilkan kebocoran memori, karena formatter tidak pernah dirilis.
mana
6
Jangan gunakan initdengan NSDateFormatter. Itu dihapus setelah iOS 3.2 . (Dan jika Anda menggunakan metode kelas sebagai gantinya, itu akan autorelease dan Anda tidak akan memiliki masalah kebocoran juga.)
zekel
3
Benar-benar menyarankan melihat di bawah ini di localizedStringFromDate
Oded Ben Dov
4
@ zekel Saya tidak yakin apa yang digunakan untuk mengatakan dokumentasi, tapi sekarang ini menunjukkan initdi beberapa tempat.
Neal Ehardt
2
Saya akan autoreleased itu (3 tahun yang lalu)
Adam Waite
283

Saya tidak tahu bagaimana kita semua melewatkan ini: localizedStringFromDate: dateStyle: timeStyle:

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

keluaran '13 / 06/12 00:22:39 GMT + 03: 00 '

Oded Ben Dov
sumber
Setelah ditulis ke sebuah string, apakah ada cara yang bagus dan rapi untuk membacanya seperti ini? (menggunakan enums NSDateFormatter)
Fonix
@Fonix Saya tidak berpikir begitu - ini adalah string terlokalisasi, yang berarti itu tergantung pada pengaturan lokal pengguna. Anda tidak boleh menyimpan tanggal dalam format seperti ini karena pengaturan dapat berubah kapan saja.
Viktor Benei
Sangat menyenangkan jika Anda menggunakan formatter langka. Kalau tidak, Anda perlu cache.
Mike Glukhov
Dalam cepat: biarkan dateString = NSDateFormatter.localizedStringFromDate (date, dateStyle: .ShortStyle, timeStyle: .FullStyle);
Cristan
1
Mengurangi jumlah kode dan mengucapkan terima kasih atas kerjanya yang sempurna
Preetha
87

Berharap untuk menambah nilai lebih dengan menyediakan formatter normal termasuk tahun, bulan, dan hari dengan waktu. Anda dapat menggunakan formatter ini selama lebih dari satu tahun

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

ada sejumlah NSDatepembantu di web, saya cenderung menggunakan:

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

Ekstrak Readme di bawah ini:

  NSString *displayString = [NSDate stringForDisplayFromDate:date];

Ini menghasilkan jenis-jenis output berikut:

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 ;-)
Nik Burns
sumber
Ini jelas merupakan solusi yang bagus. Tidak perlu membuang waktu untuk mengkhawatirkan bagaimana penampilan kencan Anda, dan bisa melanjutkan dengan pengkodean. :)
kyleturner
13

Dalam Swift:

var formatter = NSDateFormatter()
formatter.dateFormat = "yyyy"
var dateString = formatter.stringFromDate(YourNSDateInstanceHERE)
Dave Patrick
sumber
Di Swift 3.0 biarkan formatter = DateFormatter () formatter.dateFormat = "yyyy" return formatter.string (dari: 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);
SR Nayak
sumber
1
"YYYY" memberikan tahun untuk minggu ini bukan hari. Gunakan "yyyy" sebagai gantinya. Lihat pertanyaan SO ini untuk info lebih lanjut. stackoverflow.com/questions/15133549/...
Steve Moser
Terima kasih Steve moser :)
SR Nayak
4

Jika Anda tidak memiliki NSDate -descriptionWithCalendarFormat:timeZone:locale:(saya tidak percaya iPhone / Cocoa Touch termasuk ini) Anda mungkin perlu menggunakan strftime dan monyet sekitar dengan beberapa string C-style. Anda bisa mendapatkan cap waktu UNIX dari NSDatemenggunakan NSDate -timeIntervalSince1970.

pix0r
sumber
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;
}
Gank
sumber
3

Cukup tambahkan ekstensi ini:

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

Jika Anda menggunakan Mac OS X, Anda dapat menulis:

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

Namun ini tidak tersedia di iOS.

neoneye
sumber
1

cepat 4 jawaban

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)

}
Khurram awan
sumber
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];
Shamsiddin
sumber
0

Tentukan utilitas Anda sendiri untuk memformat tanggal Anda format tanggal yang diperlukan untuk misalnya.

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

Ini format cepat:

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
amin
sumber