【问题标题】:Compile Date (__DATE__) return yesterday Date编译日期(__DATE__)返回昨天的日期
【发布时间】:2014-04-20 17:31:38
【问题描述】:

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

    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

我的设备设置在美国位置。我找不到问题所在!

注意:编译时间总是20:30:00 +00:00!

我该如何解决?

【问题讨论】:

  • 是的,我做到了,而且效果很好。
  • 其实所有的答案都是有帮助和可以接受的

标签: ios xcode


【解决方案1】:

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

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

当您将description 发送到 NSDate(就像使用 %@ 格式说明符一样)时,返回的 NSString 使用 UTC 时区(末尾的 +0000)进行格式化

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

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

例如:

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

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

或者,如果您不关心区域设置日期,只需使用 compileDate 字符串。

【讨论】:

  • 感谢您的详细描述,您的理由完全正确,但您的解决方案在 NSDate 对象中返回 nil。
  • 不要更改您已有的 dateFormatter。创建一个新的将日期转换为字符串
  • 对不起!你的解决方案没问题!谢谢
【解决方案2】:

设置好了

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

【讨论】:

    【解决方案3】:

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

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

    这些宏被描述为here

    【讨论】:

      【解决方案4】:

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

      当然,每次构建 App 时都需要刷新 build.h。

      所以,我是这样做的:

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

      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];
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 2021-11-09
        • 1970-01-01
        • 2021-04-14
        • 2015-04-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多