【问题标题】:WebClient SendValues() method changes datetime valueWebClient SendValues() 方法更改日期时间值
【发布时间】:2012-08-14 11:04:58
【问题描述】:

我使用 WebClient 类在 mvc 3 项目中发送响应确认消息。消息从一个项目的一个操作方法发送到另一个项目的操作方法。 令人惊讶的是,日期参数是 3 小时后,在接收数据时。

例如,如果我的发送日期是“2012-08-14 13:42:50Z”,我会在另一边看到“2012-08-14 16:42:50Z”。 这是我案例的简化代码示例;

NameValueCollection ack = new NameValueCollection();
ack.Add("RESID", form.RESPONSE.ID.ToString());
ack.Add("A_DateTime", DateTime.Now.ToString("u")); //2012-08-14 13:42:50Z

using (var client = new WebClient())
{
    client.Encoding = System.Text.Encoding.UTF8;
    var result = client.UploadValues("http://localhost:11578/HPM/ResponseAck", ack);
}



//HPM Controller:
ResponseAck(HttpPostResponseAckMessage response)
{
    //Here response.Date vale is 2012-08-14 16:42:50Z  ???
}

在我看来,它是关于偷偷摸摸的小连载怪物因为某些文化特定问题而改变它。但我不知道真正的原因所以解决方案。

编辑:

public class HttpPostResponseAckMessage
{
    public int RESID { get; set; }

    public DateTime A_DateTime { get; set; }
}

【问题讨论】:

  • 听起来像 DateTimeKind 问题解析 HttpPostResponseAckMessage...
  • 这可能是"u" 传递给ToString 的问题。看看这个:stackoverflow.com/questions/915693/…
  • "2012-08-14 13:42:50Z" 似乎是一种很好的格式,但也许 mvc 模型绑定器解析是问题所在。但我不知道这 3 个小时会在哪里。

标签: c# asp.net-mvc-3 webclient


【解决方案1】:

您应该更改当前线程的文化或以固定格式(例如 UTC)转换和处理所有日期。 您可以使用以下代码更改线程的当前文化:

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-EN");

【讨论】:

  • 我也对线程文化持怀疑态度。我的两个项目的文化都是{tr-TR}。为什么会有问题?
  • 否 (hayır),只需在调试时检查应用程序的当前文化。最有可能的是,线程的文化是 tr-TR。你能检查一下当前线程两边的文化吗?
【解决方案2】:

好的,我认为它是关于期望 mvc 模型绑定器解析格式化的日期时间。

使用“u”格式的模型绑定器认为日期时间是 UTC。

所以我的解决方案是将属性 A_DateTime 的类型更改为字符串并在内部解析它。

希望这可以帮助像我这样的其他人。 谢谢大家。

【讨论】:

    猜你喜欢
    • 2014-05-08
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    相关资源
    最近更新 更多