Created_at.1.year.from_now - Rails

时间:2016-04-26 21:05:15

标签: ruby-on-rails ruby

我需要创建一个方法,将日期呈现给创建日期一年后的表。我已经尝试过标题中列出的那一行,但是没有用。我现在有一张桌子,旁边列出了“加入日期”,我希望它说“日期已过期”。从加入之日起一年。

示例:

public async static Task<MyAppDataModels.Common.WsResponse> PostPhotoFromUser(int catalogItemId, int objReferenceId, int languageId, byte[] fileContent)
    {
        MyAppDataModels.Common.WsResponse MyResponse = new MyAppDataModels.Common.WsResponse();
        try
        {                
            HttpClient MyHttpClient = new HttpClient();
            MyHttpClient.Timeout = TimeSpan.FromSeconds(520);
            MyHttpClient.BaseAddress = new Uri(string.Format("{0}/Application/ApplicationPostPhotoFromUser", MyAppSettings.ServerApiUrl));
            MyHttpClient.DefaultRequestHeaders.Accept.Clear();
            MyHttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            MyHttpClient.DefaultRequestHeaders.AcceptCharset.Clear();
            MyHttpClient.DefaultRequestHeaders.AcceptCharset.Add(new StringWithQualityHeaderValue("utf-8"));
            HttpRequestMessage MyWsRequest = new HttpRequestMessage(HttpMethod.Post, MyHttpClient.BaseAddress);

            dynamic MyObjData = new JObject();
            MyObjData["CatalogItemId"] = catalogItemId;
            MyObjData["ObjReferenceId"] = objReferenceId;
            MyObjData["UserId"] = string.Empty;
            MyObjData["LanguageId"] = languageId;
            MyObjData["Picture"] = fileContent;

            string MySerializedPostedData = JsonConvert.SerializeObject(MyObjData);
            MyWsRequest.Content = new StringContent(MySerializedPostedData, Encoding.UTF8, "application/json");

            HttpResponseMessage MyWsResponse = await MyHttpClient.SendAsync(MyWsRequest, HttpCompletionOption.ResponseHeadersRead);
            MyWsResponse.EnsureSuccessStatusCode();
            var MyContentResponse = await MyWsResponse.Content.ReadAsStringAsync();
            MyResponse.ResponseId = MyAppConstants.Constants.ResponseCode.Successfull;
        }
        catch (Exception ex)
        {
            MyResponse.ResponseId = MyAppConstants.Constants.ResponseCode.ErrorWhileProcessingRequest;
            MyResponse.ResponseErrorMessage = ex.Message;
        }
        return MyResponse;
    }

我应该如何格式化expiration_date方法。 date_joined工作正常。

3 个答案:

答案 0 :(得分:3)

您应该将1.year添加到created_at时间对象:

def expiration_date
  created_at + 1.year
end

格式化:

def expiration_date
  (created_at + 1.year).strftime("%-m/%-d/%-y")
end

rails console:

=> some_object.created_at
=> Wed, 12 Apr 2016 17:37:12 UTC +00:00
=> some_object.created_at + 1.year
=> Wed, 12 Apr 2017 17:37:12 UTC +00:00
=> (some_object.created_at + 1.year).strftime("%-m/%-d/%-y")
=> "4/12/17"

答案 1 :(得分:0)

我觉得你实际上在这里问错了问题。你不是在Rails中做这个功能,而是在问一个Ruby问题,“我如何使用Ruby日期时间对象之间的交互。”我建议您使用Ruby / Rails datetime对象,看看它们是如何工作的。

那就是说,我很确定别人会发布你想要的答案。

答案 2 :(得分:0)

请记住,在保存模型之前,不会填充created_at,直到那时您的计算才会起作用。这可能是个问题。

您所拥有的date_joined方法不应该存在。任何格式问题都应该是您的视图的责任,因此请将此逻辑推送到那里:

 <%= model.created_at.strftime("%-m/%-d/%-y") %>

您甚至可以使用区域设置demonstrated in this question来定义日期格式,您可以将其添加到config/locales/en.yml

en:
  date:
    formats:
      default: "%-m/%-d/%-y"
  time:
    formats:
      default: "%-m/%-d/%-y %H:%M"

然后您可以在视图中将其用作默认值,无需任何特殊处理:

<%= model.created_at %>

这将按照您想要的方式进行格式化,而不是您不得不为每个模型定义特殊的格式化程序方法,然后记住调用它们。

在未来计算日期时,你可以在日期做数学:

def expiration_date
  (self.created_at || DateTime.now) + 1.year
end

即使模型尚未保存,也能正常工作。