gpt4 book ai didi

ios - 处理时区的移动行业标准是什么?

转载 作者:行者123 更新时间:2023-11-29 12:34:06 31 4
gpt4 key购买 nike

我制作的移动应用程序使用来 self 无法控制的 .NET 服务器的 Web 服务。

我们在安排不同时区的事件时总是遇到麻烦。

服务器在美国东部时间,来自网络服务的大部分数据都以这种方式呈现。

我们最终不得不添加显示日期字段,这非常令人困惑。

此外,我的代码本质上是相同的,只是它取决于我是在与服务器通信还是在设备上计算某些东西。也是一种痛苦。

这是我处理 EST 时间的示例:

数据传入:

- (void)initWithWebServiceData:(NSDictionary *)data {

self.scheduleDate = [self dateFromDotNetJSONString:data[@"ScheduleDate"]];

//...and other stuff
}

- (NSDate *)dateFromDotNetJSONString:(NSString *)stringInEST {

int secondsESToffset = 14400;

static NSRegularExpression *dateRegEx = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
dateRegEx = [[NSRegularExpression alloc] initWithPattern:@"^\\/date\\((-?\\d++)(?:([+-])(\\d{2})(\\d{2}))?\\)\\/$" options:NSRegularExpressionCaseInsensitive error:nil];
});
NSTextCheckingResult *regexResult = [dateRegEx firstMatchInString:stringInEST options:0 range:NSMakeRange(0, [stringInEST length])];

if (regexResult) {
// milliseconds
NSTimeInterval seconds = [[stringInEST substringWithRange:[regexResult rangeAtIndex:1]] doubleValue] / 1000.0;
// timezone offset
if ([regexResult rangeAtIndex:2].location != NSNotFound) {
NSString *sign = [stringInEST substringWithRange:[regexResult rangeAtIndex:2]];
// hours
seconds += [[NSString stringWithFormat:@"%@%@", sign, [stringInEST substringWithRange:[regexResult rangeAtIndex:3]]] doubleValue] * 60.0 * 60.0;
// minutes
seconds += [[NSString stringWithFormat:@"%@%@", sign, [stringInEST substringWithRange:[regexResult rangeAtIndex:4]]] doubleValue] * 60.0;
}
return [NSDate dateWithTimeIntervalSince1970:seconds - secondsESToffset];
}
return nil;
}

数据输出:

- (void)requestRegistrationForEvent
{
NSString *fullDateTime = [NSString stringWithFormat:@"%@ %@", [self.scheduleDate webServiceStringValue], [self.scheduleDate dateTimeText]];

[self.dataController requestRegistrationForEvent:[self.eventID stringValue]
onDate:fullDateTime];
}

- (NSString *)webServiceStringValue {

NSString *webServiceStringValue = nil;

if ([self isKindOfClass:NSDate.class]) {
NSDate *date = (NSDate *)self;

//format the date how the web service expects it
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"M/d/yyyy"];

NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
[dateFormatter setTimeZone:gmt];

webServiceStringValue = [dateFormatter stringFromDate:date];
}
return webServiceStringValue;
}

- (NSString *)dateTimeText {

NSString *text = @"";
NSDate *date;

if ([self isKindOfClass:NSDate.class]) {

date = (NSDate *)self;

NSDateFormatter *timeFormatter = [[NSDateFormatter alloc] init];
[timeFormatter setDateFormat:@"h:mm a"];

NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
[timeFormatter setTimeZone:gmt];

text = [timeFormatter stringFromDate:date];

text = [text lowercaseString];
text = [text stringByReplacingOccurrencesOfString:@" " withString:@""];
}
return text;
}

问题

我做错了什么吗?我可以向我的 .NET 合作伙伴推荐什么来处理时区?

最佳答案

与其说是移动行业标准,不如说是集成和国际时间标准:时间戳应该始终使用偏移量或 UTC(祖鲁)时间。 GMT 和 EST 一样是一个时区,因此 UTC 是首选的通用时间。碰巧 GMT 不遵守夏令时,因此它通常可以互换。您的合作伙伴应以 UTC 标准发送时间戳:https://en.wikipedia.org/wiki/ISO_8601 ,看起来像 2014-11-09T10:37:27+00:00,或祖鲁语:2014-11-09T10:37:27Z。有时人们会使用诸如 2014-11-09 10:37:27UTC 之类的变体,但您可以为其中任何一个构建日期格式化程序。

日期格式将为 dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSSz"。我通常将 UTC 日期格式工厂放入 NSDateFormatter 类别中。

如果日期是唯一重要的事情,而确切时间确实不重要,那么您的方法应该足够了,除了您还需要格式化由没有时间的时间戳产生的任何内容或使用日历进行计算。

关于ios - 处理时区的移动行业标准是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26825244/

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