编译日期(__DATE__)返回昨天的日期

时间:2014-03-15 08:58:08

标签: ios xcode

为了显示构建日期,我使用了以下代码:

    NSString *compileDate = [NSString stringWithUTF8String:__DATE__];
    NSDateFormatter *df = [[NSDateFormatter alloc]init];
    [df setDateFormat:@"MMM d yyyy"];
    NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
    [df setLocale:usLocale];
    NSDate *date = [df dateFromString:compileDate];


    [df setDateFormat:@"yyyy"];
    self.backgroundColor = [UIColor clearColor];
    self.textAlignment = NSTextAlignmentCenter;
    self.text = [NSString stringWithFormat:@"© Copyright 2009-%@ Version %@ %@", [df stringFromDate:[NSDate date]], VERSION, date ];

今天是2014/03/15,它将返回2014/03/14

enter image description here

我的设备已在美国境内设置。我找不到什么错!

注意:编译时间始终为20:30:00 +00:00!

我该如何解决?

4 个答案:

答案 0 :(得分:2)

只需设置

[df setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];

答案 1 :(得分:2)

虽然您的地区可能是美国,但您的时区是伊朗的时区,即UTC + 03:30。

您正在从仅包含day组件的字符串创建NSDate。因此,此日期的时间部分将设置为午夜。此外,日期将在您当地时间创建。所以现在是午夜,伊朗时间。

当您将description发送到NSDate时(与使用%@格式说明符一样),返回的NSString将使用UTC时区(最后的+0000)格式化

午夜,或00:00:00伊朗时间,减去03:30:00的时区偏差,前一天是20:30:00。

您应该使用另一个NSDateFormatter格式化构建日期。

E.g:

NSDateFormatter *compileDayFormatter = [[NSDateFormatter alloc] init];
compileDayFormatter.dateStyle = NSDateFormatterShortStyle;

NSString *versionInfo = [NSString stringWithFormat:@"© Copyright 2009-%@ Version %@ %@", [df stringFromDate:[NSDate date]], VERSION, [compileDayFormatter stringFromDate:date]];

或者,如果您不关心语言环境感知日期,只需使用compileDate字符串。

答案 2 :(得分:1)

__DATE__包含一个字符串,该字符串仅包含预处理器运行的日期,没有与之关联的时间信息。然后,您将直接在标签中将其记录下来,并且NSDate对象会在记录时报告其在GMT中的全部时间。您看到的偏移是因为您的时区与GMT之间的差异。

使用__TIME__宏来获取正确的时间。

宏描述为here

答案 3 :(得分:1)

我的解决方案是使用构建日期创建一个build.h标头(构建版本与构建日期相关),并使用我的应用程序显示应用程序版本+构建日期。

当然,每次构建应用程序时都需要刷新build.h。

所以,我就是这样做的:

选择您的目标(您可以在其中设置分发包ID ...)/构建阶段。转到菜单编辑器/添加构建阶段/添加运行脚本构建阶段。将新创建的行(运行脚本)移动到第34行;编译源" (使用拖放)。打开行"运行脚本",并替换Type a script ... with(请用反向引号替换所有`,因为我不知道如何将这个反向引用放在代码块中):

echo "#define BUILD_DATE @\"date "+%d/%m/%Y %H:%M"\"" > build.h

现在每次构建时,build.h都将重新创建。

所以,现在你需要构建=>您将在项目的根目录中获得第一个build.h。将其添加到您的项目中。

现在,在需要信息的VC中导入build.h。

以下是我如何使用它(我对标签有一个iboultet)

- (void)viewDidLoad
{
    [super viewDidLoad];

    //cf http://stackoverflow.com/questions/3015796/how-to-programmatically-display-version-of-target-in-iphone-app-xcode
    NSString * appVersionString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];

    self.version.text = [NSString stringWithFormat:@"v %@  %@", appVersionString,BUILD_DATE];

}