我需要帮助将a转换DateTime为特定的时区.我下面的内容不能正常工作.
gmTime = 03/02/2013 1:00:00 AM
TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
var time = timeZoneInfo.ConvertTime(gmTime, timeZone);
Run Code Online (Sandbox Code Playgroud)
当我调试time应该在03/01/2013 8:00:00 PM应用区域时的值时,它会返回为03/02/2013 1:00:00 AM.
如果我这样做,time.ToLocalTime()那么我得到正确的值.但是,我需要转换time为不同的时区.
例如,使用日期和时间控件,用户选择日期和时间,以便字符串表示如下:
"6-25-2012 12:00:00 PM"
Run Code Online (Sandbox Code Playgroud)
碰巧这个用户在EST时区.该字符串将传递给服务器,服务器将其转换为.NET DateTime对象,然后将其存储在SQL Server的datetime列中.
当日期稍后返回浏览器时,需要将其转换回日期,但是当上述字符串被送入日期时,它将失去4小时的时间.我相信这是因为在创建JavaScript日期时没有指定时区时,它默认为当地时间,而且由于格林威治标准时间是-400,它从中午12点减去4小时,即使下午12点意味着指定为EST时用户在EST时区的机器上选择它.
显然,在将原始日期时间字符串传递给要保留的服务器之前,需要将其添加到原始日期时间字符串中.这样做的推荐方法是什么?
我使用以下函数DateTime从/转换为string:
DATE_OBJ.ToString(DATE_FORMAT);
DateTime.ParseExact(Date_string, DATE_FORMAT, null);
Run Code Online (Sandbox Code Playgroud)
现在我必须使用以下格式 2012-03-20T14:18:25.000+04:00
我应该使用哪种格式将其正确转换为string并string从DateTime对象生成?
我正在db中存储产品.所有日期(sql server datetime)都是UTC,以及我存储该产品的时区ID的日期.用户输入产品在列表中"from"和"until"可用的日期.所以我做了类似的事情:
// Convert user's datetime to UTC
var userEnteredDateTime = DateTime.Parse("11/11/2014 9:00:00");
// TimeZoneInfo id will be stored along with the UTC datetime
var tz = TimeZoneInfo.FindSystemTimeZoneById("FLE Standard Time");
// following produces: 9/11/2014 7:00:00 AM (winter time - 1h back)
var utcDateTime = TimeZoneInfo.ConvertTimeToUtc(userEnteredDateTime, tz);
Run Code Online (Sandbox Code Playgroud)
并保存记录.让我们假设用户在8月1日这样做,而他的时区偏移到UTC仍然是+03:00,然而未来列表的保存日期具有正确的+02:00值,因为转换考虑了"冬天"那个时期的时间.
问题是如果我试图在2014年11月11日将该产品的"从"和"直到"日期转换为产品的当地时区,那么我将得到什么日期时间值,例如,由于一些新规则过渡到冬季时间被遗弃,因此时区仍然是+03:00而不是+02:00?
// Convert back
var userLocalTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, tz);
Run Code Online (Sandbox Code Playgroud)
我会得到10AM或正确的9AM,因为OS/.NET补丁会处理这个吗?
谢谢!
PS:TimeZoneInfo有ToSerializedString()方法,如果我宁愿存储这个值而不是时区id,这会保证通过UTC datetime + serialized timezoneinfo我总能转换成用户的原始日期时间输入吗?
我有一个对象,其目前的属性为DateTime.
该对象在一个时间范围内被标记为有效.默认值为00:00:00至23:59:59
用户在UI中输入值,并通过以下方式设置属性:
new DateTime(DateTime.Now.Year,
DateTime.Now.Month,
DateTime.Now.Day,
model.Hours,
model.Minutes,
model.Seconds)
Run Code Online (Sandbox Code Playgroud)
然后在它到达数据库时将其转换为UTC.
今天的日期是2013年8月29日.如果印度的同事运行此程序,它将在2013年8月28日18:30:00将数据存储在数据库中,因为它们比UTC早5.5小时,因此2013年8月29日00:00:00变为昨天.
当逻辑尝试确定对象是否有效时,逻辑是:
if (DateTime.UtcNow.TimeOfDay > model.MyPropertyFromDB.TimeOfDay)
Run Code Online (Sandbox Code Playgroud)
我们正在尝试确定当前时间是否在00:00:00和23:59:59之间
这是因为14:00(当前时间)不大于18:30
什么是比较时间的最佳方法?
将值存储为DateTimeOffSet帮助,是否使用ToLocal()确定?
其他考虑因素是印度的用户正在使用在英国托管的应用程序,因此需要了解时区.
谢谢
我正在阅读很多关于时区,偏移,utc,当地时间,javascript函数,DST,培根的内容,而我正试图将这些内容整合在一起,为我的应用程序构建一个可靠/正确的结构.
假设我的应用程序类似于StackOverflow.
这就是我在做的......
DateTimeOffset.TimeZoneID.2012-07-19T14:30:00-03:00.我有几个问题......
关于我的服务器(单个服务器)......它应该以"中性"UTC(+00:00)运行吗?如果将来我们迁移到服务器在不同位置运行的服务器场,该怎么办?
目前,我正在将日期存储为DateTimeOffset.我正在阅读关于保存的内容,TimeZoneID但我认为没有任何用处.我错过了什么吗?
或者我应该像DateTimeUtca 一样存储日期TimeZoneID并手动转换每个日期与TimeZone班级?
在客户端上转换数据是否安全?或者日期转换应该始终在服务器端?
使用我目前的方法.DST会受到尊重吗?
我们的应用程序目前使用当地时间而不是UTC.我知道使用UTC非常重要,但不能为我的生活记住原因.
假设DateTimes存储有偏移量,当将本地时间与UTC时间进行比较时,或者与具有不同时区的其他时间进行比较时,任何值得使用的库肯定会知道不同的时区并将两个对象变为可以是相比?
只要偏移量与DateTime一起传递(比如说它将使用对象而不是字符串),我不明白为什么它很重要.我为什么要处理2014-09-01T13:44:13+00:00而不是2014-09-01T14:44:13+01:00?实际上,存储为UTC会丢失偏移信息(声明时间的本地时间).
我在这里错过了什么?
上下文:我们有限制,一个一个样式的错误,我想'啊哈:把所有的东西都转移到UTC'然后意识到我只是通过代码转换一堆DateTime对象来使用UTC时区这让我感到很浪费时间.
我在我的查询字符串中发送一个UTC日期,例如
&结束日期= 2000-01-02T03%3a04%3a05.0060000Z
我的控制器参数将它绑定在一个复杂的对象中,例如
public async Task<DocumentsRequest> GetEchoFromUriDocumentsAsync(
[FromUri] DocumentsRequest request)
{
return request;
}
Run Code Online (Sandbox Code Playgroud)
我设法弄清楚的是参数绑定后我的对象将我的UTC日期更改为本地日期+偏移量.这是我的测试用例的片段
[TestMethod]
public void Should_generate_querystring_and_parameter_bind_correctly()
{
DocumentsRequest request = DocumentRequestBuilder.DocumentsRequest();
string queryString = ReflectionQueryStringConverter.ToQueryString(request);
string baseUrl = "http://baseUrl/Test/EchoFromUriDocuments";
string uri = baseUrl + queryString;
HttpResponseMessage response = _client.GetAsync(uri).Result;
string outputString = response.Content.ReadAsStringAsync().Result;
JsonSerializer<DocumentsRequest> serializer =
new JsonSerializer<DocumentsRequest>();
DocumentsRequest output = serializer.DeserializeFromString(outputString);
output.EndDate.Should().Be(request.EndDate);
}
Run Code Online (Sandbox Code Playgroud)
以上是失败的,因为输出是:
2000-01-01T19:04:05.006-08:00
但是,json序列化然后截断偏移量并假设它是UTC日期...正如您所看到的,日期与往返后的日期不匹配.
这里有一个类似的问题,但不是一个真正的答案(回答的海报是自己的问题)
将UTC DateTime传递给Web API HttpGet方法会产生本地时间
解决此问题的正确解决方案是什么?我认为问题在于我希望参数绑定将查询字符串解析为UTC日期.TypeConverter是走的路吗?任何人都有完整的样本如何做到这一点?我是否必须在DateTime的所有类上的所有属性上使用TypeConverter?我希望有各种各样的全球配置.
谢谢.
我有两个DateTime变量。每个都有一个时区存储在变量中,这样当我ToString使用包含 zzz 的格式时,我会得到一个包含+01:00.
在设计时,我不知道时区是什么,我希望变量具有彼此不同的时区。
我想比较这两个DateTime值,以便知道哪个值更新。
例如,如果变量 A 是2015-07-04T02:00:00+03:00变量 B2015-07-03T18:00:00-07:00则 B > A。
我用 C# 写什么来告诉我这个?(我不想使用第三方库。)
(对于 SO 问题结束狂热者:我花了几个小时使用 Google、MSDN 和 SO 对此进行了调查,但很困惑。我在 SO 上找不到与此非常相似的问题。我相信这个问题的答案会对其他人有所帮助。 )
我注意到,如果我的 C# 查询包含
(e => e.MyDateTimeData == DateTime.Now)
Run Code Online (Sandbox Code Playgroud)
生成的 SQL 使用
WHERE [e].[MyDateTimeData] = GETDATE()
Run Code Online (Sandbox Code Playgroud)
当 EF 客户端时区与 SQL Server 主机 SQL Server 进程用户时区不同时,这会不好。
即使客户端进程和 SQL Server 进程在同一主机上运行,时区也可能不同。
想念我的东西,或者这是一个真正的问题?