0

現在の日付から何ミリ秒かを調べようとしています。日付を無視してミリ秒単位で時間を返すメソッドが見つからないので、timeIntervalSince 1970 メソッドによって返される値から計算できると考えました。

これは私がしました:

NSLog(@"%f", [[NSDate date] timeIntervalSince1970]);
2013-05-21 16:29:09.453 TestApp[13951:c07] 1369171749.453490

ここで、私の仮定では86,400 seconds、1 日には があるので、この値を で割り86400、1970 年から何日経過したかを取得できます。これを行うと、 が得られます15846.8952483 days。さて、もし私の仮定が成り立つなら、私は89.52483%今日一日を過ごしています。したがって、複数の場合、または約24 hours by 86.52659%の現在の時刻が得られます。ご覧のとおり、これはリアルタイムから約 5 時間ですが、返される間隔は私のタイム ゾーンより 5 時間進んでいると思います。21.4859592 hour09:29 PMNSLogGMT

だから私は、まあまあ、私はただそれを転がして何が起こるか見てみようと考えました。

次のようにして小数点以下を切り捨てました。

float timeSince1970 = [[NSDate date] timeIntervalSince1970]/86400.0;
timeSince1970 = timeSince1970 - (int)timeSince1970

次に、今日までに発生したミリ秒を計算します。

int timeNow = timeSince1970 * 86400000;
NSLog(@"%i", timeNow);
2013-05-21 16:33:37.793 TestApp[14009:c07] 77625000

次に、ミリ秒 (それでも適切と思われる) を次のように変換しますNSDate

NSString *timeString = [NSString stringWithFormat:@"%d", timeNow];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"A"]
NSDate *dateNow = [dateFormatter dateFromString:timeString];
NSLog(@"%@", dateNow);
2013-05-21 16:29:09.455 TestApp[13951:c07] 2000-01-02 03:29:00 +0000

そして、私の問題があります。2000-01-01いくつかの時間と分が添付された日付を返すのではなく、日付を返してい2000-01-02ます。どうして!?

編集

上記でメモした余分な 5 時間を「削除」することで、次のように機能するようになりました。

int timeNow = (timeSince1970 * 86400000) - (5 * 60 * 60 * 1000);

なぜこれが必要なのかわかりません。誰かが説明できれば、私はそれを大いに感謝します。

編集2

おそらく、達成しようとしているタスクを達成する方法について、より基本的な質問をする必要があります。私は時間を気にします (たとえば、午後 4 時は重要ですが、日付はあまり気にしません)。これらを次によって作成された NSDates に保存しています。

[dateFormatter setDateFormat:@"hh:mm a"];
[dateFormatter dateFromString@"04:00 PM"];

これはすべてうまくいっているようです。ここで、現在の時刻を保存した時刻と比較し、それが NSOrderedAscending または NSOrderedDescending であるかどうかを調べ、それに応じて応答したいと考えています。これを達成するためのより良い方法はありますか?

4

3 に答える 3

5

を使用して現在に基づいNSCalendarて生成し、開始の時、分、秒をすべて 0 に設定する必要があります。これにより、今日の始まりが得られます。次に、のメソッドをNSDateComponents使用して、現在から開始日までの経過時間を取得できます。NSDate-timeIntervalSinceNow

NSCalendar *cal = [NSCalendar currentCalendar];

NSDate *now = [NSDate date];

// BUILD UP NSDate OBJECT FOR THE BEGINNING OF TODAY
NSDateComponents *comps = [cal components: (NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate: now];
comps.hour = 0;
comps.minute = 0;
comps.second = 0;

// USE CALENDAR TO GENERATE NEW DATE FROM COMPONENTS
NSDate *startOfToday = [cal dateFromComponents: comps];

// YOUR ELAPSED TIME
NSLog(@"%f", [startOfToday timeIntervalSinceNow]);

編集 1

いくつかの NSDateObjects を比較するだけの場合は、当時と現在の間の時間間隔が負であるかどうかを確認できます。もしそうなら、その日付は過去です。

NSDate *saveDate = [modelObject lastSaveDate];
NSTimeInterval difference = [saveDate timeIntervalSinceNow];
BOOL firstDateIsInPast = difference < 0;
if (firstDateIsInPast) {
    NSLog(@"Save date is in the past");
}

を使用することもできますcompare:

NSDate* then = [NSDate distantPast];
NSDate* now = [NSDate date];
[then compare: now]; // NSOrderedAscending
于 2013-05-21T22:01:34.130 に答える
3

2000-01-02 の日付を返しています。どうして!?

dateFormatter現在のシステム ロケールのタイムゾーンを使用しているためです。

差し込むと…

dateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];

...日付フォーマッタは文字列を正しく解釈します。しかし、日付を直接作成しないのはなぜですか。

NSDate *dateNow = [NSDate dateWithTimeIntervalSinceReferenceDate:timeNow];
于 2013-05-21T21:58:21.737 に答える
3

「現在の日付から何ミリ秒か」を計算し、「午後 4 時は重要ですが、日付はあまり気にしない」という質問の部分は、答えられません。

これは、「今日」に時間の変更があった可能性があるためです。これにより、午前 0 時からのミリ秒数が変更されます (たとえば、1 時間の加算または減算、または年末のうるう秒など...)。日付がないと、ミリ秒数を正確に判断できません。

ここで、編集した質問に対処します。今日の日付を想定する場合、保存した時間を使用し、それを今日の日付と組み合わせて、現在の日付と時刻と比較できる「特定の時点」を取得する必要があります:

NSString *storedTime = @"04:00 PM";

// Use your current calendar 
NSCalendar *cal = [NSCalendar currentCalendar];

// Create a date from the stored time
NSDateFormatter *dateFormatter = [NSDateFormatter new];
[dateFormatter setDateFormat:@"hh:mm a"];
NSDate *storedDate = [dateFormatter dateFromString:storedTime];

// Break it up into its components (ie hours and minutes)
NSDateComponents *storedDateComps = [cal components:NSHourCalendarUnit | NSMinuteCalendarUnit 
                                           fromDate:storedDate];

// Now we get the current date/time:
NSDate *currentDateAndTime = [NSDate date];

// Break it up into its components (the date portions)
NSDateComponents *todayComps = [cal components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
                                      fromDate:currentDateAndTime];

// Combine with your stored time
todayComps.hour = storedDateComps.hour;
todayComps.minute = storedDateComps.minute;

// Create a date from the comps.
// This will give us today's date, with the time that was stored
NSDate *currentDateWithStoredTime = [cal dateFromComponents:todayComps];

// Now, we have the current date and the stored value as a date, so it is simply a matter of comparing them:
NSComparisonResult result = [currentDateAndTime compare:currentDateWithStoredTime];
于 2013-05-21T23:02:51.073 に答える