[英]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
不僅僅是一個約會,也是一個時間。
您需要在每個階段檢查:
NSDateFormatter
。 確保將時區設置為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.