Ios 是否将UTC时间转换为夏令时的PST?
我的应用程序从后端获取一些时隙,并将其转换为当前时区(PST)并显示。在白昼来临之前,一切都是完美的 在iOS中是否有一种方式可以这样说:给我这个UTC的PST日期和时间,它将自动处理夏令时。目前还可以,但仍给我一个小时的休息时间 以下是我正在做的:Ios 是否将UTC时间转换为夏令时的PST?,ios,objective-c,nsdate,dst,nstimezone,Ios,Objective C,Nsdate,Dst,Nstimezone,我的应用程序从后端获取一些时隙,并将其转换为当前时区(PST)并显示。在白昼来临之前,一切都是完美的 在iOS中是否有一种方式可以这样说:给我这个UTC的PST日期和时间,它将自动处理夏令时。目前还可以,但仍给我一个小时的休息时间 以下是我正在做的: -(NSDate *) toLocalTime:(NSDate*) currentDate { NSTimeZone *tz = [NSTimeZone timeZoneWithName:@"US/Pacific"]; NSInte
-(NSDate *) toLocalTime:(NSDate*) currentDate
{
NSTimeZone *tz = [NSTimeZone timeZoneWithName:@"US/Pacific"];
NSInteger seconds = [tz secondsFromGMTForDate: currentDate];
return [NSDate dateWithTimeInterval: seconds sinceDate: currentDate];
}
编辑
将我的代码更改为此,但结果仍然相同:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
dateFormatter.dateFormat = @"MM/dd/yyyy HH:mm:ss";
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
NSString *startDateString = [[self.slotsArray objectAtIndex:indexPath.row] objectForKey:@"StartDate"];
NSDate *startDate = [dateFormatter dateFromString:startDateString];
dateFormatter.dateStyle = NSDateFormatterMediumStyle;
dateFormatter.timeStyle = NSDateFormatterMediumStyle;
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"America/Los_Angeles"]];
NSString * dateString = [dateFormatter stringFromDate:startDate];
例如,我正在显示3月13日的一些时段,此时白昼时间开始。在UTC,我得到的时间是17:00,相当于我们今天的10点。但这起案件的实际时间是当天上午9点。我应该如何解决这个问题?不要使用
US/Pacific
尝试用America/Los_Angeles
替换它,它将自动检测DST,并将时区更改为-7
我在一些应用程序上工作,从服务器获取UTC时间,我们在使用它时从来没有遇到过问题 不要使用
US/Pacific
尝试将其替换为America/Los_Angeles
,它将自动检测DST,并将时区更改为-7
我在一些应用程序上工作,从服务器获取UTC时间,我们在使用它时从来没有遇到过问题 我不知道该方法应该做什么,但是
NSDate
没有任何时区信息,因此,如果您从一个时区“调整”到另一个时区,您就做错了。NSDate
的文档甚至说
NSDate对象封装一个时间点,独立于任何特定的日历系统或时区。
如果您有一个NSDate
,并且希望在给定时区的本地时间将其呈现给用户,您可以执行以下操作:
NSDate *date = // from somewhere
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateStyle = NSDateFormatterMediumStyle;
formatter.timeStyle = NSDateFormatterMediumStyle;
formatter.timeZone = [NSTimeZone timeZoneWithName:@"America/Los_Angeles"];
NSString *dateString = [formatter stringFromDate:date];
对于您抛出的任何NSDate
,这将为您提供一个在给定时区中具有正确日期的字符串。不要试图转换NSDate
Extra根据评论:
2016年美国的夏令时从3月13日02:00开始。此时时间向前移动一小时。如果您使用开始日期字符串@“03/12/2016 17:00:00”
(时间更改前)运行上述代码,则最终结果为2016年3月12日上午9:00
。如果您使用开始日期字符串@“03/13/2016 17:00:00”
(时间更改后)运行它,结果是2016年3月13日上午10:00
因此,代码通过在DST开始之前和之后返回不同的时间,以及通过在DST期间正确返回一天中的稍后时间,正确调整夏令时。您似乎得到了相同的结果,因此我不再确定您试图解决的问题。我不知道该方法应该做什么,但是
NSDate
没有任何时区信息,因此如果您从一个时区“调整”到另一个时区,您就做错了。NSDate
的文档甚至说
NSDate对象封装一个时间点,独立于任何特定的日历系统或时区。
如果您有一个NSDate
,并且希望在给定时区的本地时间将其呈现给用户,您可以执行以下操作:
NSDate *date = // from somewhere
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateStyle = NSDateFormatterMediumStyle;
formatter.timeStyle = NSDateFormatterMediumStyle;
formatter.timeZone = [NSTimeZone timeZoneWithName:@"America/Los_Angeles"];
NSString *dateString = [formatter stringFromDate:date];
对于您抛出的任何NSDate
,这将为您提供一个在给定时区中具有正确日期的字符串。不要试图转换NSDate
Extra根据评论:
2016年美国的夏令时从3月13日02:00开始。此时时间向前移动一小时。如果您使用开始日期字符串@“03/12/2016 17:00:00”
(时间更改前)运行上述代码,则最终结果为2016年3月12日上午9:00
。如果您使用开始日期字符串@“03/13/2016 17:00:00”
(时间更改后)运行它,结果是2016年3月13日上午10:00
因此,代码通过在DST开始之前和之后返回不同的时间,以及通过在DST期间正确返回一天中的稍后时间,正确调整夏令时。您似乎得到了相同的结果,因此我不再确定您试图解决的问题。Swift 4:
格式为“2018-03-13 07:00:00+0000”的给定日期返回值应为“2018-03-12”
Swift 4:
格式为“2018-03-13 07:00:00+0000”的给定日期返回值应为“2018-03-12”
基本上,所有的日历计算都是使用
NSCalendar
和NSDateComponents
来完成的,而不是使用像86400这样的文字数字。您所说的“在这种情况下,当天的实时时间是上午9点”是什么意思?如果您不想进行简单的时区转换(产生上午10点),请描述您希望如何转换时间。基本上,使用NSCalendar
和NSDateComponents
进行所有日历计算,而不是使用86400之类的文字数字,这是什么意思“在这种情况下,当天的实时时间是上午9点”?如果您不想进行简单的时区转换(产生上午10点),请描述您希望如何转换时间。请参见上面的编辑。我认为通过这两种方法,我可以获得与今天相同的正确日期。但今天上午10点将是当天上午9点。但如果我今天看到的是10点,而不是9点。我得到的UTC是17:00:00。您能给出一个示例,说明您从中开始使用的日期字符串吗正确的结果?这是我在startDateString“03/13/2016 17:00:00”中得到的值,然后我的dateString显示为“2016年3月13日,10:00:00 am”,这是正确的,但那天是上午9:00。不,夏令时在