gpt4 book ai didi

c# - 使用 WCF 服务和 DataTable 进行序列化/反序列化时停止自动本地化 DateTime

转载 作者:太空宇宙 更新时间:2023-11-03 15:47:15 24 4
gpt4 key购买 nike

我想不通,快把我逼疯了。为什么数据类型对象这样做超出了我的范围。我觉得处理时区的指定类型就足够了。无论如何,这是我的设置。我有一个 WCF 服务,它向我的应用程序提供一个序列化的数据表。数据通过网络界面输入。如果我将 12/12/2014 11:00 AM 放入数据库,它会通过 Web 服务严格地将数据表中的 12/12/2014 12:00 PM 返回到我的应用程序。

我该如何阻止它!?

事件链:

  1. 登录到 Web 界面,选择现在执行任务(通过 DateTime.Now)或稍后执行(解析用户选择的日期时间常量的字符串表示形式)。我将时区存储在单独的列中。注意:DateTime.Now 不会由序列化器自动本地化,其他会。
  2. 任务设置正确。所有日期都正确反射(reflect)在数据库中。目前还没有差异。
  3. 任务在正确的时间执行。因为我正在处理这些任务将在其中执行的时区差异。这工作顺利。任务在应该的时候执行。
  4. 看手机。时间不对。我断点,数据不正确,来自已序列化和反序列化的数据表中的 Web 服务。将有一个小时的休息时间(CMT 到 EST)。

我试过在不同的地方改变类型,但没有任何效果。

我想要输入数据库的内容与显示的完全一样。我通过简单的算术处理数据库逻辑中的时区转换。不需要这种自动化。

对于这样一个老问题,我厌倦了挖掘成堆的变通办法,但这些变通办法都行不通,也没有解决方案能够很好地解释该做什么以及如何处理。

最佳答案

虽然经过了很多调整,但我还是明白了。这也是针对我的特定设置,可能并不适用于所有人。

我的设置:日期时间从数据库所在时区的 Web 界面传递到数据库。在同一时区运行的 Windows 服务根据 show after 字段循环并提取任务。然后从任何时区的电话应用程序中提取此数据,并以多长时间前的形式显示值,例如 1 分钟前、2 小时前等。电话应用程序是唯一与 WCF 服务接口(interface)的应用程序。由于 Windows 服务驻留在同一台服务器上,因此不需要任何中间人。

首先在网站上输入这些“任务”时,日期时间是通过以下方式获得的。

Double selectedTimezone = 0D;
Double offsetTimezone = 0D;

TimeZoneInfo timezoneInfo = TimeZoneInfo.Local;

selectedTimezone = Double.Parse(DDL_EndTimezone.SelectedValue.ToString());

/* Obtain the timezone offset for server to user.
For me this is -1: -6 (CST) to -5 (EST) */

offsetTimezone = (timezoneInfo.BaseUtcOffset.TotalHours - selectedTimezone);

/* Parse the date time from the selected user
inputs. */

if (!chkSendMessageNow.Checked)
start = DateTime.Parse(txtBeginDate.Text + " " + cmdBeginHour.SelectedValue.ToString() + ":" + cmdBeginMinute.SelectedValue.ToString() + ":" + "00");
else
start = DateTime.Parse(DateTime.Now.ToString("MM/dd/yyyy") + " " + DateTime.Now.Hour.ToString() + ":" + DateTime.Now.Minute.ToString() + ":" + "00");
end = DateTime.Parse(txtEndDate.Text + " " + DDL_EndHour.SelectedValue.ToString() + ":" + DDL_EndMin.SelectedValue.ToString() + ":" + "00");

/* Ensure these are "local" kind. I quote because
this is local time for user, not where the
site is hosted. */

start = DateTime.SpecifyKind(start, DateTimeKind.Local);
end = DateTime.SpecifyKind(end, DateTimeKind.Local);

/* Convert the start and end to UTC from
the timezone of the user with the
adjusted server to user timezone
offset. */

start = start.AddHours(offsetTimezone).AddHours(-1 * selectedTimezone);
end = end.AddHours(offsetTimezone).AddHours(-1 * selectedTimezone);

/* Specify this is UTC. */

start = DateTime.SpecifyKind(start, DateTimeKind.Utc);
end = DateTime.SpecifyKind(end, DateTimeKind.Utc);

现在这些都保存到数据库中了。

在我的 WCF 服务的服务器上,我拉取了 DataTable,但在返回要序列化的输出之前调整了 DateTime 列,如下所示。此步骤可能不是必需的,并且是以前尝试的残余。但我不会乱用它,因为它可以正常工作。

Int32 upperBound = (output.Rows.Count - 1);

DateTime showAfter = DateTime.MinValue;
DateTime showBefore = DateTime.MinValue;

for (Int32 i = upperBound; (i >= 0); i--)
{
showAfter = (DateTime)output.Rows[i]["ShowAfter"];
showBefore = (DateTime)output.Rows[i]["ShowBefore"];

showAfter = DateTime.SpecifyKind(showAfter, DateTimeKind.Utc);
showBefore = DateTime.SpecifyKind(showBefore, DateTimeKind.Utc);

output.Rows[i]["ShowAfter"] = showAfter;
output.Rows[i]["ShowBefore"] = showBefore;
}

最后在应用程序中反序列化时显示正确的本地化时间。我执行以下操作。

DateTime showAfter = DateTime.MinValue;

showAfter = Convert.ToDateTime(_dataTable.Rows[position]["ShowAfter"]);
showAfter = DateTime.SpecifyKind(showAfter, DateTimeKind.Utc);
showAfter = showAfter.ToLocalTime();

关于c# - 使用 WCF 服务和 DataTable 进行序列化/反序列化时停止自动本地化 DateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27607587/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com