关于 c#:DateTimeFormat 问题 | 珊瑚贝

DateTimeFormat Issue


我没有从 DateTime-Object 获得以下所需的输出:

2010-03-29 13:15:00

我的默认本地化是 de-DE,所以一个简单的 ToString 给了我:

29.03.2010 13:15:00

我尝试的是从 US-Culture 创建一个 DateTimeFormatInfo 对象并使用它的 DateTimePatterns 但没有成功:

1
2
3
Dim usDateFormat As Globalization.DateTimeFormatInfo = New Globalization.CultureInfo(“en-US”, False).DateTimeFormat
usDateFormat.DateSeparator =“-“
ruleResult.Claim.Last_Updated_Date.ToString(usDateFormat.ShortDatePattern)

输出:3.29.2010

什么是获得我想要的 DateTimeFormat 的最佳方式(可读、最快)(我有时需要短日期,有时需要日期和时间,就像我上面的例子一样)?

感谢您的期待,
蒂姆

编辑:为什么我的 DateTimeFormatInfo 方法不起作用,并且在使用 String.Format 或 ToString(“yyyy-MM-dd HH:mm:ss”) 解决方案而不是私有共享(静态) DateTimeFormatInfo 时会产生性能差异-目的?我至少调用了这个函数 30k 次,里面有很多日期要格式化。


我认为您正在寻找的是:

1
DateTime.Now.ToString(“yyyy-MM-dd HH:mm:ss”);

这里有一些例子,我想如果你看一下你就可以理解它是如何工作的:

1
2
3
4
5
6
7
8
9
10
11
12
13
// create date time 2008-03-09 16:05:07.123
DateTime dateTime = new DateTime(2008, 3, 9, 16, 5, 7, 123);

dateTime.ToString(“y yy yyy yyyy”);  //”8 08 008 2008″   year
dateTime.ToString(“M MM MMM MMMM”);  //”3 03 Mar March”  month
dateTime.ToString(“d dd ddd dddd”);  //”9 09 Sun Sunday” day
dateTime.ToString(“h hh H HH”    );  //”4 04 16 16″      hour 12/24
dateTime.ToString(“m mm”         );  //”5 05″            minute
dateTime.ToString(“s ss”         );  //”7 07″            second
dateTime.ToString(“f ff fff ffff”);  //”1 12 123 1230″   sec.fraction
dateTime.ToString(“F FF FFF FFFF”);  //”1 12 123 123″    without zeroes
dateTime.ToString(“t tt”         );  //”P PM”            A.M. or P.M.
dateTime.ToString(“z zz zzz”     );  //”-6 -06 -06:00″   time zone


要获得 2010-03-29 13:15:00 我会使用自定义模式。在这种情况下:

1
DateTime.Now.ToString(“yyyy-MM-dd HH:mm:ss”);

有关详细信息,请参阅此 MSDN 文章

  • 谢谢你(和其他人)。为什么我的 DateTimeFormatInfo 设置 DateSeparator 的方法不起作用,这是格式化日期的最快方法(性能)(请参阅我的编辑)。
  • 我认为(因为我还没有尝试过)你想要寻求文化不变量,然后更改设置。


这个解决方案怎么样:

1
2
3
4
5
6
7
8
// Get a default DateTimeFormat
var dateTimeFormat = CultureInfo.GetCultureInfo(“en-US”).DateTimeFormat;
// Clone it to make it writeable
dateTimeFormat = (DateTimeFormatInfo)dateTimeFormat.Clone();
// Change the DateSeparator
dateTimeFormat.DateSeparator =“-“;
// Output it as normal
var output = DateTime.Now.ToString(“g”, dateTimeFormat);

我认为大多数人不知道你可以通过调用 Clone() 方法创建一个新对象来获得文化的可写版本。

更新

正如蒂姆所说,你也可以这样称呼它:

1
2
3
4
5
6
// Get a default DateTimeFormat
var dateTimeFormat = new CultureInfo(“en-US”).DateTimeFormat;
// Change the DateSeparator
dateTimeFormat.DateSeparator =“-“;
// Output it as normal
var output = DateTime.Now.ToString(“g”, dateTimeFormat);

这行得通,因为我们创建了一个源自给定文化的新 CultureInfo。第一个是只读的,原因在于,在第一种情况下,我们将在框架深处的某处获得对某个静态创建的实例的引用,并通过 Clone() 调用创建一个新类具有相同的设置。在第二种方法中,我们直接创建了新的类,但是说我们希望从特定文化中获取所有设置。

所以说到底,两个版本都在做同样的事情,换句话说。如果两个版本之间存在性能差异,我无法判断,但我认为这可以忽略不计。

更新 2

在阅读了汤姆斯的最后一条评论后,他尝试了这样的事情:

1
2
3
4
5
6
// Get a default DateTimeFormat
var dateTimeFormat = new CultureInfo(“en-US”).DateTimeFormat;
// Change the DateSeparator
dateTimeFormat.DateSeparator =“-“;
// Output it as normal
var output = DateTime.Now.ToString(dateTimeFormat.ShortDatePattern);

这会导致错误的输出。这是因为在 dateTimeFormat.ShortDatePattern 中只是一个包含 M/d/yyyy 的普通字符串。所以和调用 DateTime.Now.ToString(“M/d/yyyy”).

是一样的

由于事实上, / 将被 DateSeparator 替换,并且当前没有给出 IFormatProvider ,它将采用当前的文化,在您的情况下是德语。所以要解决这个问题,你应该试试下面的代码:

1
2
3
4
5
6
// Get a default DateTimeFormat
var dateTimeFormat = new CultureInfo(“en-US”).DateTimeFormat;
// Change the DateSeparator
dateTimeFormat.DateSeparator =“-“;
// Output it as normal
var output = DateTime.Now.ToString(dateTimeFormat.ShortDatePattern, dateTimeFormat);


通过这些信息,您还应该能够对更快的情况做出一些假设:

1
2
var output = DateTime.Now.ToString(dateTimeFormat.ShortDatePattern, dateTimeFormat);
var output = DateTime.Now.ToString(“M/d/yyyy”, dateTimeFormat);

由于它们完全相同,因此性能应该没有差异

  • 谢谢。而且我忘了提到我得到了一个 InvalidOperationException 因为它是只读的,但只有在使用 GetCultureInfo 函数而不是构造函数时。有什么不同?
  • 为什么 DateSeparator 输出仍然是 \\’.\\’ 而不是 \\’/\\’ 即使根据调试器它应该是斜线?
  • @Tim:我用 @”\”、”\\t”、”_” 和 “/” 测试了上面的代码。在每种情况下,我都将预期结果放入我的 output 变量中。我唯一能想到的是你错过了在 ToString() 调用中添加 dateTimeFormat 作为第二个参数。
  • 感谢您的调查。 Date.Now.ToString(dfi) 给出了预期的结果(其中 dfi 是一个带有 dateSeparator=”-” 的 datetimeformatinfo 对象)。但是 Date.Now.ToString(dfi.ShortdatePattern) 以 “.” 作为分隔符给出了错误的结果。但无论如何,我认为我使用”yyyy-MM-dd hh:mm:ss”-方法,即使我认为这不太可读并且可能(?)更慢。


您可以像这样在 DateTime 的 ToString 中使用格式化选项

1
DateTime.Now.ToString(“yyyy-MM-dd HH:mm:ss”);

1
DateTime.Now.ToString(“yyyy-MM-dd”);

1
2
3
DateTime.Now.ToString(“yyyy-MM-dd HH:mm:ss”)

DateTime.Now.ToString(“yyyy-MM-dd”)


你也可以试试format(date.now,”yyyy-MM-dd HH:mm:ss)


1
string.Format(“{0:yyyy-MM-dd HH:mm:ss}”, DateTime.Now)

对于预定义的模式检查这个:
http://alexonasp.net/samples/stringformatting/


来源:https://www.codenong.com/3717272/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_8775.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?