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

我的应用程序从后端获取一些时隙,并将其转换为当前时区(PST)并显示。在白昼来临之前,一切都是完美的

在iOS中是否有一种方式可以这样说:给我这个UTC的PST日期和时间,它将自动处理夏令时。目前还可以,但仍给我一个小时的休息时间

以下是我正在做的:

-(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。不,夏令时在