Mat*_*sen 60 iphone cocoa nsdate nsdateformatter
我使用什么setDateFormat选项获取NSDateFormatter来获取一个月的序数后缀?
例如,下面的片段目前产生:
8月15日星期六下午3:11
我必须改变什么:
8月15 日星期六下午3:11
NSDate *date = [NSDate date];
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4];
[dateFormatter setDateFormat:@"h:mm a EEEE MMMM d"];
NSString *dateString = [dateFormatter stringFromDate:date];
NSLog(@"%@", dateString);
Run Code Online (Sandbox Code Playgroud)
在PHP中,我将在上面的例子中使用它:
<?php echo date('h:m A l F jS') ?>
是否有一个NSDateFormatter等效于PHP格式化字符串中的S选项?
cbh*_*000 94
这些答案中没有一个像我正在使用的那样美观,所以我想我会分享:
斯威夫特3:
func daySuffix(from date: Date) -> String {
let calendar = Calendar.current
let dayOfMonth = calendar.component(.day, from: date)
switch dayOfMonth {
case 1, 21, 31: return "st"
case 2, 22: return "nd"
case 3, 23: return "rd"
default: return "th"
}
}
Run Code Online (Sandbox Code Playgroud)
Objective-C的:
- (NSString *)daySuffixForDate:(NSDate *)date {
NSCalendar *calendar = [NSCalendar currentCalendar];
NSInteger dayOfMonth = [calendar component:NSCalendarUnitDay fromDate:date];
switch (dayOfMonth) {
case 1:
case 21:
case 31: return @"st";
case 2:
case 22: return @"nd";
case 3:
case 23: return @"rd";
default: return @"th";
}
}
Run Code Online (Sandbox Code Playgroud)
显然,这只适用于英语.
Mat*_*sen 54
NSDate *date = [NSDate date];
NSDateFormatter *prefixDateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[prefixDateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4];
[prefixDateFormatter setDateFormat:@"h:mm a EEEE MMMM d"];
NSString *prefixDateString = [prefixDateFormatter stringFromDate:date];
NSDateFormatter *monthDayFormatter = [[[NSDateFormatter alloc] init] autorelease];
[monthDayFormatter setFormatterBehavior:NSDateFormatterBehavior10_4];
[monthDayFormatter setDateFormat:@"d"];
int date_day = [[monthDayFormatter stringFromDate:date] intValue];
NSString *suffix_string = @"|st|nd|rd|th|th|th|th|th|th|th|th|th|th|th|th|th|th|th|th|th|st|nd|rd|th|th|th|th|th|th|th|st";
NSArray *suffixes = [suffix_string componentsSeparatedByString: @"|"];
NSString *suffix = [suffixes objectAtIndex:date_day];
NSString *dateString = [prefixDateString stringByAppendingString:suffix];
NSLog(@"%@", dateString);
Run Code Online (Sandbox Code Playgroud)
Ger*_*Ger 26
这很容易在iOS9中完成
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.numberStyle = NSNumberFormatterOrdinalStyle;
NSArray<NSNumber *> *numbers = @[@1, @2, @3, @4, @5];
for (NSNumber *number in numbers) {
NSLog(@"%@", [formatter stringFromNumber:number]);
}
// "1st", "2nd", "3rd", "4th", "5th"
Run Code Online (Sandbox Code Playgroud)
Swift 2.2:
let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = .OrdinalStyle
let numbers: [Int] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for number in numbers {
print(numberFormatter.stringFromNumber(number)!)
}
Run Code Online (Sandbox Code Playgroud)
SDJ*_*tie 16
这是生成后缀的方法的另一个实现.它产生的后缀仅在英语中有效,在其他语言中可能不正确:
- (NSString *)suffixForDayInDate:(NSDate *)date
{
NSInteger day = [[[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] components:NSDayCalendarUnit fromDate:date] day];
if (day >= 11 && day <= 13) {
return @"th";
} else if (day % 10 == 1) {
return @"st";
} else if (day % 10 == 2) {
return @"nd";
} else if (day % 10 == 3) {
return @"rd";
} else {
return @"th";
}
}
Run Code Online (Sandbox Code Playgroud)
这将分两步进行格式化:首先,创建一个带有适当后缀的日期的子字符串,然后为其余部分创建一个格式字符串,插入已经格式化的日期。
func ordinalDate(date: Date) -> String {
let ordinalFormatter = NumberFormatter()
ordinalFormatter.numberStyle = .ordinal
let day = Calendar.current.component(.day, from: date)
let dayOrdinal = ordinalFormatter.string(from: NSNumber(value: day))!
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "h:mm a EEEE MMMM '\(dayOrdinal)'"
return dateFormatter.string(from: Date())
}
Run Code Online (Sandbox Code Playgroud)
由于序数日由 构建NumberFormatter,因此它应该适用于所有语言,而不仅仅是英语。
您可以通过将分配替换为以下内容来获取为当前语言环境排序的格式字符串dateFormat:
dateFormatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "h:mm a EEEE MMMM d", options: 0, locale: dateFormatter.locale)?.replacingOccurrences(of: "d", with: "'\(dayOrdinal)'")
Run Code Online (Sandbox Code Playgroud)
请注意其他几个人的建议,即创建格式化程序的成本很高,因此您应该在经常调用的代码中缓存和重用它们。
小智 6
这已在基金会中实现。
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .ordinal
numberFormatter.locale = Locale.current
numberFormatter.string(for: 1) //Should produce 1st
numberFormatter.string(for: 2) //Should produce 2nd
numberFormatter.string(for: 3) //Should produce 3rd
numberFormatter.string(for: 4) //Should produce 4th
Run Code Online (Sandbox Code Playgroud)