ToShortDateString()在运行时如何确定?

时间:2015-10-20 10:54:11

标签: c# datetime

我对这种方法有很多问题。如果我将代码编译为可执行文件,那么该方法会以其运行的机器或其编译的机器的格式生成日期字符串吗?

我在英国的日期格式的机器上编译它并在美国的机器上运行它的日期格式是什么?我不得不手动开始生成日期字符串,但这会导致其他错误,因为似乎SQL服务器会自动将日期从UK格式转换为US格式,因此当我手动生成美国格式的字符串时,它会抛出异常在我的笔记本电脑上运行它来测试代码然后再提交它。

2 个答案:

答案 0 :(得分:3)

来自reference source;

public String ToShortDateString() {
       return DateTimeFormat.Format(this, "d", DateTimeFormatInfo.CurrentInfo);
}

这意味着它使用The "d" standard format specifier设置的CurrentCulture

来自The Short Date ("d") Format Specifier

  

"d"标准格式说明符表示自定义日期和时间   格式字符串,由特定文化定义   DateTimeFormatInfo.ShortDatePattern property

这意味着,此方法会生成当前文化设置的短日期模式。这就是为什么如果您当前的文化设置在不同的机器中不同,那么正常以获得不同的结果。如果您想指定另一种文化,可以将其用作ToString方法中的第二个参数。

  

似乎SQL服务器将日期从英国格式转换为美国格式   自动

基于此,我强烈怀疑您尝试将DateTime值作为字符串保存到SQL Server。 不要那样做。将它们作为DateTime 直接传递给您的parameterized queries

DateTime没有任何隐式格式。它只是日期和时间值。 SQL Server将其保存为binary。格式概念仅在您获得文本(字符串)表示时才有意义。

阅读:Bad habits to kick : choosing the wrong data type

答案 1 :(得分:1)

它使用执行的线程的CurrentCulture进行格式化,因此在CompileTime中无法确定,请参阅此测试:

var dt = DateTime.Now;

Console.WriteLine(dt.ToShortDateString());
// in germany: 20.10.2015
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-us");
// in usa: 10/20/2015
Console.WriteLine(dt.ToShortDateString());

您可以通过将所需的区域性提交到ToString方法来绕过此方法,该方法不会影响线程的CurrentCulture:

// "d" is standard-format for short date pattern,
// see https://msdn.microsoft.com/de-de/en-en/library/az4se3k1(v=vs.110).aspx for further info
Console.WriteLine(dt.ToString("d", new CultureInfo("en-us")));

但是,与DBMS交互,我强烈建议使用ISO Date-Pattern,如下所示:

dt.ToString("O");  // 2015-10-20T13:08:53.1242403+02:00