簡體   English   中英

在字符串日期前一天將字符串格式的日期轉換為nsdate結果

[英]Converting a date by string format to nsdate result one day before string date

我搜索了我的問題,但我沒有找到任何相關的幫助......

故事:用戶按名稱,開始日期,結束日期和注釋創建繼續事件,因此保存Sqlite數據庫上的所有字段。 兩種日期格式均為“yyyy-MM-dd”。 之后,當用戶想要對事件執行操作時,應用程序會檢查用戶按開始日期和結束日期選擇的日期,以及輸入的日期是在開始日期之前還是在結束日期之后通知用戶。

問題:作為用戶,我創建了一個從2012年8月18日到2012年9月18日的活動。 然后我把登錄在18-8-2012,我收到了通知。 我調試了應用程序。 我很驚訝 格式為“yyyy-MM-dd”的字符串中的日期對象為“2012-08-17 19:30:00 +0000”。 代碼是:

           #define kPickerDate @"yyyy-MM-dd"
           NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
           [formatter setDateFormat:kPickerDate];
           NSDate *sDate = [formatter dateFromString:start_date]; 
           NSDate *eDate = [formatter dateFromString:exam_date]; 

app怎么樣??????????????

NSDate不僅僅是一個約會,也是一個時間。

您需要在每個階段檢查:

  • 解析時,您的日期是否正確構建? 它應該是UTC的午夜,而不是當地的午夜。 您可能正在使用NSDateFormatter 確保將時區設置為UTC。
  • 您的日期是否正確存儲在SQLite中? 再次確保您將其存儲為UTC。 但是,如果你正確地解析它,這應該可行。
  • 您是否正確格式化輸出? 可能使用NSDateFormatter 確保將時區設置為UTC。

只有當這三件都完美無缺時,你才能擺脫潛在的錯誤。

要設置日期格式化程序的時區,請使用:

formatter.timeZone = [NSTimeZone timeZoneWithAbbreviation: @"UTC"];

不要試圖通過采用當地時間解決這個問題。

當地時間的問題:

  • 在許多時區,夏令時間每年都會改變幾次。 一小時的差異將把你的時間的一部分扔到前一天!
  • 如果用戶處於沒有夏令時的時區,他們可能會前往不同的時區。 同樣,您的時間的日期部分可能會被拋棄一天。

唯一安全的做法是在任何地方使用UTC。

(我實際上有點生活在UTC的可憐的人;他們不會被迫從他們的應用程序中擺脫這些錯誤!)

您可以使用更好的方法創建NSDate對象。 首先修改NSDate的@interface(您可以在任何地方執行此操作)。 為此,請將其放在頭文件中。

@interface NSDate (missingFunctions) 
+ (NSDate *)dateWithYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day;
@end

然后在主文件中放:

@implementation NSDate (missingFunctions)
+ (NSDate *)dateWithYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day {
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *components = [[NSDateComponents alloc] init];
    [components setYear:year];
    [components setMonth:month];
    [components setDay:day];

    //BUT MOST IMPORTANTLY:
    [components setTimeZone:[NSTimeZone localTimeZone]];
    [components setHour:hour];
    [components setMinute:minute];
    [components setSecond:second];

    return [calendar dateFromComponents:components];
}   
@end

然后從代碼調用的任何地方(例如):

[NSDate dateWithYear:1969 month:8 day:15];

並且它將根據您在正確時區的請求返回NSDate。 您可以通過在官方蘋果文檔中閱讀有關NSTimeZone的更多信息來更改要使用的時區。

注意我不能因為編寫這段代碼而受到贊譽,但我可以保證它可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM