[英]ASP.NET MVC convert DateTime to UTC to send to API
我需要将开始日期和结束日期发送到 UTC 格式的 API,我尝试了以下操作:
DateTime startDate = Convert.ToDateTime(start + "T00:00:00Z").ToUniversalTime();
DateTime endDate = Convert.ToDateTime(end + "T23:59:59Z").ToUniversalTime();
但他们似乎没有转换为 UTC,将 startDate 和 endDate 转换为 UTC 的正确方法是什么?
开始是一个字符串,是 2018-08-31,结束日期也是一个字符串,是 2018-08-31 我在上面的代码中添加了时间以涵盖完整日期。
假设您希望endDate
表示UTC中给定日期的最后可能时刻:
DateTime startDate = DateTime.ParseExact(start, "yyyy-MM-dd", CultureInfo.InvariantCulture,
DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal);
DateTime endDate = DateTime.ParseExact(end, "yyyy-MM-dd", CultureInfo.InvariantCulture,
DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal)
.AddDays(1).AddTicks(-1);
其他一些事情:
ToUniversalTime
从计算机的本地时区转换为UTC(除非.Kind == DateTimeKind.Utc
)。 除非计算机的本地时区与您的情况有关,否则通常应避免使用它。
在上面的代码中,您既需要AssumeUniversal
表示输入日期将被解释为UTC,也需要AdjustToUniversal
表示希望将输出值保留为UTC而不是计算机的本地时区。
UTC不是“格式”。 您合并的日期和时间字符串将采用ISO 8601扩展格式(也符合RFC 3339)。
通常,尽量不要使用Convert.ToDateTime
。 它相当于DateTime.Parse
与CultureInfo.CurrentCulture
并没有DateTimeStyles
。 在某些情况下这可能会起作用,但是通常更具体一些更好。
.AddDays(1).AddTicks(-1)
可以使您到达该日期的最后一个可表示的价格变动。 这样可以在开始和结束之间进行包含性的比较,但是它具有无法将两个值相减并不能获得完整的24小时的缺点。 因此,它通常是最好只跟踪00:00
一天到00:00
,第二天,然后用在结束日期独家对比。 (仅应比较开始日期。)
换句话说,代替:
2018-08-31T00:00:00.0000000Z <= someValueToTest <= 2018-08-31T23:59:59.9999999Z
做这个:
2018-08-31T00:00:00.0000000Z <= someValueToTest < 2018-09-01T00:00:00.0000000Z
移除Z
string start = "2018-08-31";
string end = "2018-08-31";
DateTime startDate = Convert.ToDateTime(start + "T00:00:00");
DateTime endDate = Convert.ToDateTime(end + "T23:59:59");
Console.WriteLine(startDate); // 8/31/2018 12:00:00 (Local)
Console.WriteLine(startDate.ToUniversalTime()); // 8/31/2018 5:00:00 (UTC)
Console.WriteLine(endDate); // 8/31/2018 11:59:59 (Local)
Console.WriteLine(endDate.ToUniversalTime()); // 9/1/2018 4:59:59 (UTC)
首先从NuGet软件包管理器安装以下软件包,并在您的项目中引用它:
Install-Package Newtonsoft.Json
现在,您可以轻松地使用JsonConvert.SerializeObject(object value)
方法将任何对象序列化为Json。
要将DateTime转换为UTC,请使用TimeZoneInfo.ConvertTimeToUtc(DateTime dateTime)
方法。
在您的情况下:
DateTime date = DateTime.Parse("2018-08-31");
DateTime dateTimeToUtc = TimeZoneInfo.ConvertTimeToUtc(date);
string dateInJson = JsonConvert.SerializeObject(dateTimeToUtc);
变量dateInJson的值将类似于2018-08-30T19:30:00Z
。
如果您像我一样发送动态 linq,则需要文本形式的日期时间。 如果您正在处理 UTC,那么:
//specify utc just to avoid any problem
DateTime dateTime = yourDateTime.SetKindUtc();
var filterToSendToApi = $"CreatedTime>={dateTime.ToStringUtc()}"
帮手:
public static string ToStringUtc(this DateTime time)
{
return $"DateTime({time.Ticks}, DateTimeKind.Utc)";
}
public static DateTime SetKindUtc(this DateTime dateTime)
{
if (dateTime.Kind == DateTimeKind.Utc)
{
return dateTime;
}
return DateTime.SpecifyKind(dateTime, DateTimeKind.Utc);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.