gpt4 book ai didi

objective-c - 将任何日期转换为本地日期问题

转载 作者:行者123 更新时间:2023-12-03 17:53:37 26 4
gpt4 key购买 nike

由于时区问题,我被困在 NSDateNSDateFormatter 中的某个地方。

我需要仅以 UTC 格式向服务器发送时间(转换为 unix 时间)。

这是我正在做的几个步骤:

  1. 从日历中选择的日期应添加当前时间并转换为 UTC。

  2. 将所选日期与当前日期进行比较。只是为了知道所选日期是过去的日期还是将来的日期。 (很少有其他操作需要根据过去/ future /当前日期完成)。

我尝试过这段代码:

NSDate 的类别中:

-(NSDate *) toLocalTime{
NSDate* sourceDate = self;
NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithName:@"UTC"];
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];

NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;

NSDate* destinationDate = [[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate];

return destinationDate;
}

但是当我尝试将日期转换为本地日期时,问题就存在了(有时我不确定当前时间是否在本地时区)。如果它们采用 UTC,则上述方法可以正常工作。

如果时间已经是本地时区,那么它会再次添加间隔,并且我得到的时间不正确。

我没有想法,请帮助我。

任何想法都将受到高度赞赏。

最佳答案

NSDate 表示自 1970 年 1 月 1 日以来的 UTC 时间。永远不要试图假装它是其他东西。切勿尝试将 NSDate 视为特定的本地时间。

因此,您需要的是日历中的日期 + 表示自今天午夜以来的时间的偏移量。

要获取今天凌晨 0:00 UTC,您首先需要 UTC 时区的公历。

NSTimeZone* utcTimeZone = [NSTimeZone timeZoneWithName:@"UTC"];
NSCalendar* gregorian = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
[gregorian setTimeZone: utcTimeZone];

现在,您使用日期组件来获取自 UTC 午夜以来的小时、分钟和秒

NSUInteger unitFlags = NSHourCalendarUnit | NSMinuteCalendarUnit |  NSSecondCalendarUnit;
NSDate *date = [NSDate date];
NSDateComponents *comps = [gregorian components: unitFlags fromDate:date];

如果您的日历中的日期是 UTC 午夜,您可以获取 UTC 午夜 + 您的小时、分钟和秒,如下所示:

NSDate* theDateIWant = [gregorian dateByAddingComponents: comps 
toDate: midnightUTCDateFromCalendar
options: 0];
NSLog(@"The final date is %@", theDateIWant);

关于objective-c - 将任何日期转换为本地日期问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17879943/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com