【发布时间】:2017-09-07 06:07:16
【问题描述】:
我无法将 ISO DateTime 格式值仅转换为日期值。我尝试了Parse、ParseExact 和TryParseExact,但都失败了并继续给我相同的值输出(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属性,而不是DateTime。DateTime本身是一个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