NSDate が今日であるかどうかを判断するにはどうすればよいですか?
-
22-09-2019 - |
質問
かどうかを確認する方法 NSDate
今日のものですか?
以前は最初の 10 文字を使用してチェックしていました [aDate description]
. [[aDate description] substringToIndex:10]
のような文字列を返します "YYYY-MM-DD"
そこで私はその文字列と によって返された文字列を比較しました [[[NSDate date] description] substringToIndex:10]
.
もっと迅速かつ/または適切にチェックする方法はありますか?
ありがとう。
解決
macOS 10.9 以降および iOS 8 以降では、まさにこれを行うメソッドが NSCalendar/Calendar にあります。
- (BOOL)isDateInToday:(NSDate *)date
だからあなたはただそうするだけです
目標-C:
BOOL today = [[NSCalendar currentCalendar] isDateInToday:date];
スイフト3:
let today = Calendar.current.isDateInToday(date)
他のヒント
あなたは日付コンポーネントを比較することができます:
NSDateComponents *otherDay = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:aDate];
NSDateComponents *today = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:[NSDate date]];
if([today day] == [otherDay day] &&
[today month] == [otherDay month] &&
[today year] == [otherDay year] &&
[today era] == [otherDay era]) {
//do stuff
}
編集ます:
私はステファンの方法のように多くの、私はそれが掃除機、よりわかりやすいと思うif文ます:
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:(NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:[NSDate date]];
NSDate *today = [cal dateFromComponents:components];
components = [cal components:(NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:aDate];
NSDate *otherDate = [cal dateFromComponents:components];
if([today isEqualToDate:otherDate]) {
//do stuff
}
クリスは、私はあなたの提案を取り入れてきました。私は知らない、それはBCとADを区別し、誰のために、時代が何であったか調べる必要がありました。これはおそらく、ほとんどの人にとって不必要であるが、私はそれを含めましたので、それは、チェックするのは簡単だし、いくつかの確実性を追加します。あなたはスピードのためつもりなら、これはおそらく、とにかく良い方法ではありません。
<時間> 注はSO上で多くの答えとして、7年後にこれは完全にアウトの日付のです。スウィフトでは今ちょうど.isDateInToday
これは、あなたの質問に分派ですが、
機能を使用し、「Today」または「Yesterday」でNSDateを印刷する場合- (void)setDoesRelativeDateFormatting:(BOOL)b
NSDateFormatterのための
今日の日付を午前0時に正規化し、2番目の日付を午前0時に正規化し、それが同じNSDateであるかどうかを比較しようとします。
から アップルの例 今日の日付を午前 0 時に正規化し、2 番目の日付にも同じことを行って比較する方法は次のとおりです。
NSCalendar * gregorian = [[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents * components =
[gregorian components:
(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit)
fromDate:[NSDate date]];
NSDate * today = [gregorian dateFromComponents:components];
ワーキングのスイフト3&4拡張する Catfish_Manによって提案の
extension Date {
func isToday() -> Bool {
return Calendar.current.isDateInToday(self)
}
}
要素、時代やものでジャグリングする必要はありません。
NSCalendarは、既存の日付の特定の時間単位の始まりを取得するための方法を提供します。
このコードは、今日と別の日付で開始し、それを比較されます。それはNSOrderedSame
と評価された場合、両方の日付は同じ日の間にある - 今日ので、
NSDate *today = nil;
NSDate *beginningOfOtherDate = nil;
NSDate *now = [NSDate date];
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&today interval:NULL forDate:now];
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&beginningOfOtherDate interval:NULL forDate:beginningOfOtherDate];
if([today compare:beginningOfOtherDate] == NSOrderedSame) {
//otherDate is a date in the current day
}
extension NSDate {
func isToday() -> Bool {
let cal = NSCalendar.currentCalendar()
var components = cal.components([.Era, .Year, .Month, .Day], fromDate:NSDate())
let today = cal.dateFromComponents(components)!
components = cal.components([.Era, .Year, .Month, .Day], fromDate:self)
let otherDate = cal.dateFromComponents(components)!
return today.isEqualToDate(otherDate)
}
スウィフト2.0に私のために働いた
最良の答えのスウィフトのバージョン:
let cal = NSCalendar.currentCalendar()
var components = cal.components([.Era, .Year, .Month, .Day], fromDate:NSDate())
let today = cal.dateFromComponents(components)!
components = cal.components([.Era, .Year, .Month, .Day], fromDate:aDate);
let otherDate = cal.dateFromComponents(components)!
if(today.isEqualToDate(otherDate)) {
//do stuff
}
Apple のドキュメントの「Performing Calendar Calculations」というタイトルのエントリを参照してください。 [リンク].
このページのリスト 13 は、日間の午前 0 時の数を決定するには、以下を使用することを示唆しています。
- (NSInteger)midnightsFromDate:(NSDate *)startDate toDate:(NSDate *)endDate
{
NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
NSInteger startDay = [calendar ordinalityOfUnit:NSDayCalendarUnit
inUnit:NSEraCalendarUnit
forDate:startDate];
NSInteger endDay = [calendar ordinalityOfUnit:NSDayCalendarUnit
inUnit:NSEraCalendarUnit
forDate:endDate];
return endDay - startDay;
}
次に、そのメソッドを使用して 0 が返されるかどうかを確認することで、2 日が同じかどうかを判断できます。
また、現在の日付と現在の日付の間の時間間隔を確認することもできます。
[myDate timeIntervalSinceNow]
これにより、myDate と現在の日付/時刻の間の時間間隔が秒単位で表示されます。
リンク.
編集:皆さんへの注意:[myDate timeIntervalSinceNow] では、myDate が今日であるかどうかを明確に判断できないことはよく承知しています。
誰かが同様のものを探していて、[myDate timeIntervalSinceNow] が役立つ場合に、ここで見つけられるように、この回答はそのままにしておきます。
ベストアンサーに基づくスウィフト延長ます:
extension NSDate {
func isToday() -> Bool {
let cal = NSCalendar.currentCalendar()
if cal.respondsToSelector("isDateInToday:") {
return cal.isDateInToday(self)
}
var components = cal.components((.CalendarUnitEra | .CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay), fromDate:NSDate())
let today = cal.dateFromComponents(components)!
components = cal.components((.CalendarUnitEra | .CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay), fromDate:self);
let otherDate = cal.dateFromComponents(components)!
return today.isEqualToDate(otherDate)
}
}
、その後、calendar:components:fromDate
への呼び出しは、多くの時間を取ることを始めます。いくつかの私が行っているプロファイリングによると、彼らは非常に高価であるように見える。
あなたは日付、と言うのNSArray *datesToCompare
の一部配列から、いくつかの特定の日と同じ日であるかを決定しようとしていると言う、NSDate *baseDate
は、その後、あなたは(一部の答えを上から適応)は、次のようなものを使用することができると言います。
NSDate *baseDate = [NSDate date];
NSArray *datesToCompare = [NSArray arrayWithObjects:[NSDate date],
[NSDate dateWithTimeIntervalSinceNow:100],
[NSDate dateWithTimeIntervalSinceNow:1000],
[NSDate dateWithTimeIntervalSinceNow:-10000],
[NSDate dateWithTimeIntervalSinceNow:100000],
[NSDate dateWithTimeIntervalSinceNow:1000000],
[NSDate dateWithTimeIntervalSinceNow:50],
nil];
// determine the NSDate for midnight of the base date:
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* comps = [calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit)
fromDate:baseDate];
NSDate* theMidnightHour = [calendar dateFromComponents:comps];
// set up a localized date formatter so we can see the answers are right!
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
// determine which dates in an array are on the same day as the base date:
for (NSDate *date in datesToCompare) {
NSTimeInterval interval = [date timeIntervalSinceDate:theMidnightHour];
if (interval >= 0 && interval < 60*60*24) {
NSLog(@"%@ is on the same day as %@", [dateFormatter stringFromDate:date], [dateFormatter stringFromDate:baseDate]);
}
else {
NSLog(@"%@ is NOT on the same day as %@", [dateFormatter stringFromDate:date], [dateFormatter stringFromDate:baseDate]);
}
}
出力:
Nov 23, 2011 1:32:00 PM is on the same day as Nov 23, 2011 1:32:00 PM
Nov 23, 2011 1:33:40 PM is on the same day as Nov 23, 2011 1:32:00 PM
Nov 23, 2011 1:48:40 PM is on the same day as Nov 23, 2011 1:32:00 PM
Nov 23, 2011 10:45:20 AM is on the same day as Nov 23, 2011 1:32:00 PM
Nov 24, 2011 5:18:40 PM is NOT on the same day as Nov 23, 2011 1:32:00 PM
Dec 5, 2011 3:18:40 AM is NOT on the same day as Nov 23, 2011 1:32:00 PM
Nov 23, 2011 1:32:50 PM is on the same day as Nov 23, 2011 1:32:00 PM
上記の回答の多くのより簡単な方法があります!
NSDate *date = ... // The date you wish to test
NSCalendar *calendar = [NSCalendar currentCalendar];
if([calendar isDateInToday:date]) {
//do stuff
}
これはおそらく、NSDateカテゴリとして作り直し、私は使用することができます:
// Seconds per day (24h * 60m * 60s)
#define kSecondsPerDay 86400.0f
+ (BOOL) dateIsToday:(NSDate*)dateToCheck
{
// Split today into components
NSCalendar* gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents* comps = [gregorian components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit)
fromDate:[NSDate date]];
// Set to this morning 00:00:00
[comps setHour:0];
[comps setMinute:0];
[comps setSecond:0];
NSDate* theMidnightHour = [gregorian dateFromComponents:comps];
[gregorian release];
// Get time difference (in seconds) between date and then
NSTimeInterval diff = [dateToCheck timeIntervalSinceDate:theMidnightHour];
return ( diff>=0.0f && diff<kSecondsPerDay );
}
(ただし、元の質問のように2つの日付の文字列を比較すると、ほぼ「クリーナー」を感じている...)
//this is now => need that for the current date
NSDate * now = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[calendar setTimeZone:[NSTimeZone systemTimeZone]];
NSDateComponents * components = [calendar components:( NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate: now];
[components setMinute:0];
[components setHour:0];
[components setSecond:0];
//this is Today's Midnight
NSDate *todaysMidnight = [calendar dateFromComponents: components];
//now timeIntervals since Midnight => in seconds
NSTimeInterval todayTimeInterval = [now timeIntervalSinceDate: todaysMidnight];
//now timeIntervals since OtherDate => in seconds
NSTimeInterval otherDateTimeInterval = [now timeIntervalSinceDate: otherDate];
if(otherDateTimeInterval > todayTimeInterval) //otherDate is not in today
{
if((otherDateTimeInterval - todayTimeInterval) <= 86400) //86400 == a day total seconds
{
@"yesterday";
}
else
{
@"earlier";
}
}
else
{
@"today";
}
now = nil;
calendar = nil;
components = nil;
todaysMidnight = nil;
NSLog("Thank you :-)");
私たちのエリカSadunの偉大NSDate extension
を確認してください。使用することは非常にシンプル。ここでそれをファインます:
http://github.com/erica/NSDate-Extensionsする
それは、この記事では、すでにあります: https://stackoverflow.com/a/4052798/362310 の
力アンラップなし正しく安全ソリューション、スウィフト2.2にとiOS 8の前に作業します:
func isToday() -> Bool {
let calendar = NSCalendar.currentCalendar()
if #available(iOS 8.0, *) {
return calendar.isDateInToday(self)
}
let todayComponents = calendar.components([.Era, .Year, .Month, .Day], fromDate:NSDate())
let dayComponents = calendar.components([.Era, .Year, .Month, .Day], fromDate:self)
guard let today = calendar.dateFromComponents(todayComponents),
day = calendar.dateFromComponents(dayComponents) else {
return false
}
return today.compare(day) == .OrderedSame
}
ここに私の2セントの解答受け入れ答えに構築するが、同様に、新しいAPIをサポートしているのです。注:あなたがフィット感を見るように、ほとんどのタイムスタンプはGMTが、変更あなたのものとして私は、グレゴリオ暦を使用する
func isDateToday(date: NSDate) -> Bool {
let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
if calendar.respondsToSelector("isDateInToday:") {
return calendar.isDateInToday(date)
}
let dateComponents = NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay
let today = calendar.dateFromComponents(calendar.components(dateComponents, fromDate: NSDate()))!
let dateToCompare = calendar.dateFromComponents(calendar.components(dateComponents, fromDate: date))!
return dateToCompare == today
}
私のソリューションは、部門によって1970年から渡されたどのくらいの日数計算で、整数部分を比較する
#define kOneDay (60*60*24)
- (BOOL)isToday {
NSInteger offset = [[NSTimeZone defaultTimeZone] secondsFromGMT];
NSInteger days =[self timeIntervalSince1970] + offset;
NSInteger currentDays = [[NSDate date] timeIntervalSince1970] + offset;
return (days / kOneDay == currentDays / kOneDay);
}
NSDate *dateOne = yourDate;
NSDate *dateTwo = [NSDate date];
switch ([dateOne compare:dateTwo])
{
case NSOrderedAscending:
NSLog(@”NSOrderedAscending”);
break;
case NSOrderedSame:
NSLog(@”NSOrderedSame”);
break;
case NSOrderedDescending:
NSLog(@”NSOrderedDescending”);
break;
}