【问题标题】:How can I serialize DateTime values as `yyyy-MM`? [duplicate]如何将 DateTime 值序列化为“yyyy-MM”? [复制]
【发布时间】:2020-03-17 05:41:18
【问题描述】:

在 ASP.NET MVC 应用程序中,我以这种方式从数据库中获取日期:

public class MonthController : ApiController

{
    public List<Month> monthContainer;

    public List<Month> getMonth()
    {
        DataContext dataContext = new DataContext();

        monthContainer = (from d in dataContext.Duties
                          select new Month()
                          {
                              MonthDate = d.Date
                          }).ToList();
        return monthContainer;
    }

答案是这样格式的日期:

{
    "MonthDate": "2015-10-01T00:00:00"
},
{
    "MonthDate": "2015-10-02T00:00:00"
}

所以它会在 MonthDate 的每一天一直持续到某一年。 我怎样才能以这种格式只提取几个月而没有双打? 如何在控制器中进行更改? 我想得到这种格式:

    "MonthDate": "2015-10"
    "MonthDate": "2015-11"
    "MonthDate": "2015-12"
    "MonthDate": "2016-01"
... "MonthDate": "2019-12"

【问题讨论】:

  • 日期没有格式。它们是二进制值。 仅在将文本解析为日期或将日期格式化为显示文本时使用格式。无论您在何处显示这些日期,都可以添加格式字符串或以您想要的格式调用ToString 或String.Format
  • 如何显示这些日期?这就是您需要使用格式化的地方。至少贴出相关的视图代码
  • 你可以使用DisplayFormat属性告诉MVC如何格式化特定的字段。您可以将[DisplayFormat(DataFormatString = "{0:yyyy-MM}")] 添加到MonthDate 属性
  • 您可能需要将Month 类的MonthDate 属性更改为字符串类型。那么您可以使用以下代码。 monthContainer = (from d in dataContext.Duties select new Month() { MonthDate = d.Date.ToString("yyyy-MM", CultureInfo.InvariantCulture) }).ToList();因为date 类型没有任何格式,它是一个二进制值,您可以在转换为字符串时对其进行格式化。
  • @Panagiotis Kanavos,嗨!重复的解决方案帮助了我,我在模型中创建了新类,他们转换了我的 JSON,谢谢!

标签: c# asp.net-web-api json.net


【解决方案1】:

请像这样使用 DateTime.ParseExact :

DateTime.ParseExact(MonthDate.ToString(), "yy/MM/dd HH:mm:ss", 
    CultureInfo.InvariantCulture
    ).ToString("yyyy-MM")

【讨论】:

  • 嗨!请告诉我,这段代码会在代码的哪一部分正确添加?
  • @just none - 两个答案都是错误的。日期在 view 中格式化,而不是在查询中。发布您的查看代码
  • OP 询问格式化,而不是解析。无论如何,该字符串与yy/MM/dd HH:mm:ss 不匹配。此外,如果MonthDate已经是一个日期,那么解析的意义何在?
【解决方案2】:

您必须使用 parseExact 方法,例如:

MonthDate = DateTime.ParseExact(d.Date, "yyyy-MM",CultureInfo.InvariantCulture);

一些文档: https://docs.microsoft.com/en-us/dotnet/api/system.datetime.parseexact?view=netframework-4.8

【讨论】:

  • OP 询问格式化,而不是解析。无论如何,该字符串与yyyy-MM 不匹配
  • 他没有要求格式化或解析,他只是说他想将日期转换为特定格式
  • 这就是格式化的意思。即使在 SQL 中,CONVERT 也会将非文本值格式化为预定义格式的字符串
猜你喜欢
  • 2011-04-01
  • 2020-01-13
  • 2016-10-17
  • 2013-12-18
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 2021-12-02
相关资源
最近更新 更多