【问题标题】:how to convert iso datetime to date in c#?如何在c#中将iso datetime转换为日期?
【发布时间】:2017-09-07 06:07:16
【问题描述】:

我无法将 ISO DateTime 格式值仅转换为日期值。我尝试了ParseParseExactTryParseExact,但都失败了并继续给我相同的值输出(1984-04-26T00:00:00)。

我提到了很多 references 和其他 SO 问题,但没有任何帮助

我正在使用 DTO,这是属性,

public DateTime Dob { get; set; }

我正在运行 for 循环来连接来自我的 LINQ 查询的数据,并且我正在尝试按如下方式进行转换,

for (int i = 0; i < PatientInfo.Count; i++)
{
    PatientInfo[i].Dob =
    DateTime.Parse(String.Format("{0:MM/dd/yyyy}", PatientInfo[i].Dob.ToString()));
    PatientInfo[i].PartnerData = PartnerInfo.Where(a => a.FileId == PartnerInfo[i].FileId).ToList();
}

我在这里缺少什么?

以下是API controller代码,

[HttpGet("{id}")]
public async Task<IActionResult> GetPatReg([FromRoute] long id)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    var PatientInfo = await _context.PatReg
        .Where(a => a.FileId == id)
        .Select(b => new PatRegDto
        {
            Action = "Get",
            FileId = b.FileId,
            FName = b.FName,
            MName = b.MName,
            LName = b.LName,
            Dob = b.Dob
        }).ToListAsync();
    var PartnerInfo = await _context.PatPar
        .Where(s => s.FileId == id)
        .Select(m => new PatParDto
        {
            RecId = m.RecId,
            FileId = m.FileId,
            ParFileId = m.ParFileId,
            SDate = m.SDate,
            EDate = m.EDate,
        }).ToListAsync();

    for (int i = 0; i < PartnerInfo.Count; i++)

    {
        PartnerInfo[i].FullName = _context.PatReg.Where(a => a.FileId == PartnerInfo[i].ParFileId)
                               .Select(t => new { t.fullname })
                               .Single().fullname;
        PartnerInfo[i].dob = _context.PatReg.Where(a => a.FileId == PartnerInfo[i].ParFileId)
                               .Select(t => new { t.Dob })
                               .Single().Dob;

        PartnerInfo[i].Action = "Get";
    }

    for (int i = 0; i < PatientInfo.Count; i++)

    {
        PatientInfo[i].Dob =
        DateTime.Parse(String.Format("{0:MM/dd/yyyy}", PatientInfo[i].Dob.ToString()));

        PatientInfo[i].PartnerData = PartnerInfo.Where(a => a.FileId == PartnerInfo[i].FileId).ToList();
    }

    if (PatientInfo == null)
    {
        return NotFound();
    }

    var DataRes = new
    {
        sdata = PatientInfo
    };

    return Ok(DataRes);
}

更新 我的 DTO 是

    public class PatRegDto

    {
        public string Action { get; set; }
        private Int64 _FileId;
        public Int64 FileId
        {
            get
            {
                return this._FileId;
            }
            set
            {
                this._FileId = value;
            }
        }
        public string FName { get; set; }
        public string MName { get; set; }
        public string LName { get; set; }
        public string fullname
        {
            get { return FName + " " + MName + " " + LName; }
        }
        public DateTime Dob { get; set; }
        public List<PatParDto> PartnerData { get; set; }
    }
    public class PatParDto

    {
        public string Action { get; set; }
        public long RecId { get; set; }
        public long FileId { get; set; }
        public long ParFileId { get; set; }
        public DateTime SDate { get; set; }
        public DateTime? EDate { get; set; }
        public DateTime dob { get; set; }
        public string FullName { get; set; }
    }

【问题讨论】:

  • A DateTime 基本上只是一个 Int64 计算自 0000-01-01 00:00:00.000000 以来的滴答声(如果它是“本地”或 UTC 或未知 iirc 则为标志)。所以你永远不会只有一个“日期”,你总是会有“时间”信息,直到滴答声。按照惯例,dateTimeValue.Date 返回一个 DateTime 值,其中小时、分钟、秒及以下都设置为零。
  • @JSON 那么你应该在输出中将新格式表示为string 属性,而不是DateTimeDateTime 本身是一个 struct,它没有任何日期格式,只有一些整数日期/时间属性和一个用于确定本地/UTC 时间的标志。
  • @JSON - 是的,当然。这基本上就像int i = int.Parse(1.ToString("000")); 一样——它不会改变1 的“格式”,因为1 没有 格式。 -- 就像任何 DateTime 值没有格式一样。
  • @JSON 你曾经(或现在)对DateTime 是什么感到非常困惑。它仅存储刻度、小时、天等。它不包含格式。它仅在转换为string 时显示格式。当然,当它转换为string 时,您需要注意您的应用程序中可能需要或不需要的任何文化信息。但只有到那时,在将DateTime 变成string 时,你才能给它一个格式。
  • @Dennis.Verweij - 你是对的,DateTime 甚至不“存储”小时、日期等; DateTime 只是一个数字(同样,基本上是 (U)Int64),其他所有内容(非常很快)根据需要计算。

标签: c# .net asp.net-web-api datetime-conversion


【解决方案1】:

请不要使用PatientInfo[i].Dob.ToString()),因为它将使用您当前的文化设置序列化为字符串。根据您的操作系统语言设置,您将有不同的字符串。除了 DateTime 包含返回日期的 Date 属性;)

【讨论】:

  • 你能用上面的代码分享你的想法吗?
【解决方案2】:

那么这是唯一的解决方案吗? 我将public string DobFormat { get; set; } 添加到PatRegDto DTO 然后,

for (int i = 0; i < PatientInfo.Count; i++)

            {
                PatientInfo[i].DobFormat = PatientInfo[i].Dob.ToString("MM/dd/yyyy");
                PatientInfo[i].PartnerData = PartnerInfo.Where(a => a.FileId == PartnerInfo[i].FileId).ToList();

            }

【讨论】:

  • 这取决于您要存储的内容 - stringDateTime。这完全取决于你。
  • 我想我会保持不变,并通过使用 moment-js 格式化这些日期在客户端处理我的结果对象
  • 你知道你不会格式化日期,对吧?您格式化字符串。然后可以将字符串解析为日期。
  • @Enigmativity,是的,当然。我的问题是我曾经以完全不同的方式来做这件事。我曾经使用 SQL SP,在那些我可以按照我想要的方式格式化我的日期(基本上输出为字符串)我只是在这里错过了它,但谢谢我的意思是格式化字符串输出
  • 我不明白为什么您认为 SP 可以比 .NET 更好地格式化日期。基本上它们做的事情完全相同——.NET 可能要灵活得多。
【解决方案3】:

以上所有有价值的 cmets 的另一个答案,

公共类 PatRegDto

{
    public string Action { get; set; }
    private Int64 _FileId;
    public Int64 FileId
    {
        get
        {
            return this._FileId;
        }
        set
        {
            this._FileId = value;
        }
    }
    public string FName { get; set; }
    public string MName { get; set; }
    public string LName { get; set; }
    public string fullname
    {
        get { return FName + " " + MName + " " + LName; }
    }
    public string Dob { get; set; }
    public List<PatParDto> PartnerData { get; set; }
}

在控制器中

var PatientInfo = await _context.PatReg
        .Where(a => a.FileId == id)
        .Select(b => new PatRegDto
        {
            Action = "Get",
            FileId = b.FileId,
            FName = b.FName,
            MName = b.MName,
            LName = b.LName,
            Dob = (b.Dob).ToString("dd/M/yyyy"),
        }).ToListAsync();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 2019-05-20
    • 2013-07-30
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    相关资源
    最近更新 更多