NSDateFormatter setDateFormat の序数月日サフィックス オプション
-
16-09-2019 - |
質問
月日の序数接尾辞を取得するには、NSDateFormatter のどの setDateFormat オプションを使用すればよいですか?
例えば以下のスニペットは現在、次の内容を生成します。
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);
PHP では、上記の場合にこれを使用します。
<?php echo date('h:m A l F jS') ?>
と同等の NSDateFormatter はありますか? S PHPフォーマット文字列のオプション?
解決 2
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);
他のヒント
これらの答えのどれもが、私が使用しているものととして美的なかったので、私は私が共有するだろうと思っます:
<時間>スウィフト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"
}
}
<時間>
の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";
}
}
<時間>
もちろん、これは英語のみで動作します。
これは簡単にできます 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"
から引用 NSシップスター
スイフト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)!)
}
ここで接尾辞を生成するための方法のための別の実装です。それが生成する接尾辞は英語でのみ有効であり、他の言語で正しくない可能性があります:
- (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";
}
}
日付フォーマッタその書式指定子の規格。この仕様では、任意の日に、このようなサフィックスを許可しません。あなたがものをしたい場合、あなたはそれを自分で生成する必要があります。
マット・アンデルセンの答えは非常に精巧であり、従ってSDJMcHattieです。しかしNSDateFormatterは、CPUにかなり重いですし、この100Xを呼び出す場合、あなたは本当に、影響を参照してくださいので、ここでは上記の回答から得られる組み合わせたソリューションです。 (上記はまだ正しいことに注意してください)。
NSDateFormatterが夢中になっている高価なの を作成します。作成の一度と再利用の、しかし、注意してください:それは、スレッドごとにその1、スレッドセーフではないです。
の;の self.date = [NSDate日付]と仮定すると
/ * SDJMcHattieのコードは、これは、配列を使用するよりも便利です* / 出力:15:11土曜日8月15日 - (NSString *)formattedDate{
static NSDateFormatter *_dateFormatter = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_dateFormatter = [[NSDateFormatter alloc] init];
_dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
_dateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
});
_dateFormatter.dateFormat = [NSString stringWithFormat:@"h:mm a EEEE MMMM d'%@'", [self suffixForDayInDate:self.date]];
NSString *date = [_dateFormatter stringFromDate:self.date];
return date;
}
- (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";
}
}
これは、形式の文字列を与えるだろう「22:10 8月2日(土曜日)」
-(NSString*) getTimeInString:(NSDate*)date
{
NSString* string=@"";
NSDateComponents *components = [[NSCalendar currentCalendar] components: NSCalendarUnitDay fromDate:date];
if(components.day == 1 || components.day == 21 || components.day == 31){
string = @"st";
}else if (components.day == 2 || components.day == 22){
string = @"nd";
}else if (components.day == 3 || components.day == 23){
string = @"rd";
}else{
string = @"th";
}
NSDateFormatter *prefixDateFormatter = [[NSDateFormatter alloc] init]; [prefixDateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4];
[prefixDateFormatter setDateFormat:[NSString stringWithFormat:@"h:mm a EEEE, d'%@' MMMM",string]];
NSString *dateString = [prefixDateFormatter stringFromDate:date];
return dateString;
}
これは、2つのステップで書式設定を行います。まず、適切なサフィックスを持つ日である部分文字列を作成し、その後、既にフォーマット日に差し込む、残りの部分のためのフォーマット文字列を作成する
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())
}
序数日はNumberFormatter
によって構築されているので、、それはすべての言語だけでなく、英語で動作するはずです。
あなたはこれでdateFormat
する割り当てを置き換えることにより、現在のロケールのために注文した書式文字列を取得することができます:
dateFormatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "h:mm a EEEE MMMM d", options: 0, locale: dateFormatter.locale)?.replacingOccurrences(of: "d", with: "'\(dayOrdinal)'")
あなたが頻繁に呼び出されるコードでそれらをキャッシュして再利用する必要がありますので、、フォーマッタを作成することは高価であることを、いくつか他の人からアドバイスを注意します。
このはすでに財団に実装されています。
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
それとも、任意の数の接尾辞をしたい場合:
extension Int {
public func suffix() -> String {
let absSelf = abs(self)
switch (absSelf % 100) {
case 11...13:
return "th"
default:
switch (absSelf % 10) {
case 1:
return "st"
case 2:
return "nd"
case 3:
return "rd"
default:
return "th"
}
}
}
}
思考が正の数のための5つの可能性があるということで。これは、最初の場所の桁が1であること、「ST」であるのです。これは、2位の数字は、「第二」という2であるのです。これは、3位の桁が「RD」という3であるのです。その他の場合は、「目」である、またはそれは第二位だ場合の数字は、上記のルールが適用されないと、それは「目」で、1です。
モジュロ100は私たち桁の最後の2つの数値を与え、私たちは11 13にモジュロ10を確認することができます私たちの桁の最後の番号を与えますので、最初の条件でキャッチされていない場合、私たちは1、2、3を確認することができます。
遊び場にその拡張子を試してみてください。
let a = -1
a.suffix() // "st"
let b = 1112
b.suffix() // "th"
let c = 32
c.suffix() // "nd"
バイナリ操作および/またはアレイを使用して、これを書くためにも短い方法があるかどうかを見るのが大好きだ!
- (void)viewDidLoad
{
NSDate *date = [NSDate date];
NSDateFormatter *prefixDateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[prefixDateFormatter setDateFormat:@"yyy-dd-MM"];
date = [prefixDateFormatter dateFromString:@"2014-6-03"]; //enter yourdate
[prefixDateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4];
[prefixDateFormatter setDateFormat:@"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);
}
答えはどれも迅速に数フォーマッタに既に存在している序数のスタイルを使用していません。
var dateString: String {
let calendar = Calendar.current
let dateComponents = calendar.component(.day, from: date)
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .ordinal
let day = numberFormatter.string(from: dateComponents as NSNumber)
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMM"
return day! + dateFormatter.string(from: date)
}
私は、カテゴリNSDate +追加でNSDateにこれらの2つの方法を追加しました。
\- (NSString *)monthDayYear
{
NSDateFormatter * dateFormatter = NSDateFormatter.new;
[dateFormatter setDateFormat:@"MMMM d*, YYYY"];
NSString *dateString = [dateFormatter stringFromDate:self];
return [dateString stringByReplacingOccurrencesOfString:@"*" withString:[self ordinalSuffixForDay]];
}
\- (NSString *)ordinalSuffixForDay {
NSDateFormatter * dateFormatter = NSDateFormatter.new;
[dateFormatter setDateFormat:@"d"];
NSString *dateString = [dateFormatter stringFromDate:self];
NSString *suffix = @"th";
if ([dateString length] == 2 && [dateString characterAtIndex:0] == '1') {
return suffix;
}
switch ([dateString characterAtIndex:[dateString length]-1]) {
case '1':
suffix = @"st";
break;
case '2':
suffix = @"nd";
break;
case '3':
suffix = @"rd";
break;
}
return suffix;
}
あなたはそれらを組み合わせて、スイッチ点として、あなたのフォーマット文字列内の日の1の位の数字のインデックスを作成することによって、それらをより効率的に作ることができます。私は序数接尾辞が異なる日付形式について個別に呼び出すことができるような機能を分離することにしました。
- (NSString *)dayWithSuffixForDate:(NSDate *)date {
NSInteger day = [[[NSCalendar currentCalendar] components:NSDayCalendarUnit fromDate:date] day];
NSString *dayOfMonthWithSuffix, *suffix = nil ;
if(day>0 && day <=31)
{
switch (day)
{
case 1:
case 21:
case 31: suffix = @"st";
break;
case 2:
case 22: suffix = @"nd";
break;
case 3:
case 23: suffix = @"rd";
break;
default: suffix = @"th";
break;
}
dayOfMonthWithSuffix = [NSString stringWithFormat:@"%ld%@", (long)day , suffix];
}
return dayOfMonthWithSuffix;
}
NSDateFormatterのドキュメントは、それがサポートするすべてのフォーマットオプションは TR35に記載されていることを述べていますのます。
なぜあなたはこれをしたいですか?あなたは、マシンが解析するために何かを作っている場合は、を使用する必要がありますISO 8601形式に、またはあなたが持っている場合。それらのどちらも1は、序数接尾辞を必要としたりできます。
ユーザーに、日付を表示する場合は、ユーザーのロケール設定からのいずれかの形式を使用する必要があります。