【问题标题】:Setting format of DateTime - how do I keep the value in DateTime format?DateTime 的设置格式 - 如何保持 DateTime 格式的值?
【发布时间】:2014-09-08 12:38:00
【问题描述】:

我创建了一个格式为dd/MM/yyyy HH:mm:ss 的日期时间。我正在编写与需要 DateTime 变量的第三方 SOAP 库交互的代码,格式为 yyyy-MM-dd HH:mm:ss

为了调用第三方 SOAP 库,我如何更改信息在 DateTime 变量中的存储方式,即不更改系统范围内的日期?

我研究了 CultureInfo,它有点令人困惑,而且可能是一个太持久的解决方案;我唯一需要更改 DateTime 的时间是针对此单个调用的实例。

作为解释,库有一个函数GetOrders(DateTime startDate, DateTime endDate, TradingRoleCodeType roleType, OrderStatusCodeType statusType)。当尝试使用创建的 DateTimes 执行函数时,它会生成错误“抱歉,结束日期丢失、无效或早于开始日期。必须在 YYYY-MM-DD 或 YYYY-MM-DD HH:MI 中: SS 格式,并且在开始日期之后。”。鉴于作为dd/MM/yyyy HH:mm:ss 传入的格式,我认为这可能是问题所在。

【问题讨论】:

  • ii 格式说明符是什么?你的意思是mm
  • 另外,“改变信息在DateTime中的存储方式”是什么意思,如果你想保留第3个的格式,你想存储一个字符串吗? -派对图书馆?太抽象了。
  • DateTime 没有格式。通过字符串表示日期需要format。见Standard Date and Time Format StringsCustom Date and Time Format Strings
  • change the way the information is stored in the DateTime variable。数据并没有像您想象的那样以特定的字符串格式存储。你只想使用ToString() 并指定你想要的格式
  • 无论您喜欢与否,都会使用CultureInfo。但就像其他人所说的,在与第三方库通信时,只需使用所需的格式说明符即可。我怀疑库需要一个字符串,而不是“DateTime 变量”。

标签: c# datetime cultureinfo


【解决方案1】:

我创建了一个日期时间,格式为 dd/MM/yyyy HH:ii:ss

不,你没有。你有一个日期时间。它没有格式。它是一个数字 - 你知道,在文档中有很好的记录。字符串形式永远不会在存储的 DateTime 中使用,只有在生成字符串以进行演示时才使用。

如何更改信息在 DateTime 中的存储方式 变量,用于调用第三方 SOAP 库, 即没有对日期进行系统范围的更改?

你没有。我建议您与您的 SOAP 库交谈-顺便说一句,它不是 SOAP,IIRC 您作为示例提供的格式在 SOAP 中无效。是的,坏消息。有人想要伪肥皂。

http://www.w3schools.com/schema/schema_dtypes_date.asp

描述所有有效的日期、时间和日期时间格式,而您的格式不存在。

您可以在线程级别来回更改默认格式,因此一种解决方案是在调用soap库之前设置它。另一种方法是让某人修复 SOAP 层以接受标准格式。

【讨论】:

  • 我很抱歉不知道我正在使用的第三方代码的确切用语。在构建我的问题时,我只能看到一条错误消息,指出我正在以错误的格式传递 DateTime。
  • 一个日期时间对象?还是一些字符串?如上所述,没有与 System.DateTime 实例关联的格式。您可以使用 .ToString() 以单独的格式输出。
  • @DavidSmithson 请不要将基本 .NET 和编程概念的滥用归咎于“第三方代码的确切说法”。数字/日历对象没有格式是基线知识。你基本上不应该看错误,但也要对核心概念有扎实的理解。关于“我如何更改 DateTime 对象中数据的格式”的问题与第三方设置无关。
【解决方案2】:

您可以创建一个虚拟日期:

public class SomeClass
{
    [XmlIgnore]
    public DateTime SomeDate { get; set; }

    [XmlElement("SomeDate")]
    public string SomeDateString
    {
        get { return this.SomeDate.ToString("yyyy-MM-dd HH:mm:ss"); }
        set { this.SomeDate = DateTime.Parse(value); }
    }
}

来源:Force XmlSerializer to serialize DateTime as 'YYYY-MM-DD hh:mm:ss' --kbrimington

【讨论】:

    【解决方案3】:

    事实证明,正如一些人指出的那样,问题与作为 DateTime 的变量无关,也与不是“格式”的“格式”有关,但肯定是信息在一种可以理解的方法。

    该信息的基本问题是标准时间和 UTC 时间之间的 DateTime 比较。第三方库将 DateTime 作为 UTC DateTime 进行检查,当在一年中的正确时间捕捉到时间差异时,可能会导致比较 DateTime 出现问题;尽管向用户显示的是参考时间之后的时间,但计算时实际上是参考时间之前的时间,意味着比较失败。

    这个问题的主要内容是询问传递给函数的信息,如果您无法访问第三方库代码,也无法访问足够详细的文档,并且在与所述第三方交互时发生错误-派对代码。

    特别是,测试各种用例以确定哪些变量值导致失败以及哪些导致代码成功执行;识别模式,然后测试确认模式的特定用例。从那里,确定正在发生的实际错误和解决问题的代码。

    在 DateTimes 的情况下,代码可以理解 DateTimeKinds,例如 C#,请记住测试不同的 DateTimeKinds 以确定它们是否会成为问题的一部分;它并不经常发生在我身上,但它已经发生了(正如这个问题所证明的那样)。

    最后,错误代码没有多大帮助,而且会导致糟糕的问题和糟糕的建议;在类似的情况下,反复试验似乎是最好的。

    【讨论】:

      【解决方案4】:

      您不需要更改它的存储方式,如上所述。 您需要根据 ISO8601 将 is 格式化为字符串,这是您的 SOAP 服务期望的 datetime 参数。

      检查How to parse and generate DateTime objects in ISO 8601 format

      Given a DateTime object, how do I get an ISO 8601 date in string format?

      【讨论】:

        猜你喜欢
        • 2015-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-31
        • 1970-01-01
        • 1970-01-01
        • 2010-12-21
        相关资源
        最近更新 更多