DateTimeFormat问题

时间:2010-09-15 11:48:17

标签: c# .net vb.net datetime localization

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

  

2010-03-29 13:15:00

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

  

29.03.2010 13:15:00

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

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-Object?我正在调用此函数至少30k次,并且内部格式有很多日期。

7 个答案:

答案 0 :(得分:11)

我认为你在寻找的是:

DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

以下是一些示例,我认为如果看一下那么你可以理解它是如何工作的:

// 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

答案 1 :(得分:4)

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

DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");

有关详细信息,请参阅this MSDN article

答案 2 :(得分:2)

这个解决方案怎么样:

// 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()方法创建一个新对象来获得文化的可写版本。

更新

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

// 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

读完Toms的最后评论后,他尝试这样的事情:

// 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,它将采用您的案例中的当前文化德语。因此,要解决此问题,您应该尝试以下代码:

// 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);

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

var output = DateTime.Now.ToString(dateTimeFormat.ShortDatePattern, dateTimeFormat);
var output = DateTime.Now.ToString("M/d/yyyy", dateTimeFormat);

由于这些完全相同,因此性能应该没有区别

答案 3 :(得分:1)

DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")

DateTime.Now.ToString("yyyy-MM-dd")

答案 4 :(得分:1)

您可以使用DateTime的ToString中的格式化选项,如下所示

<强>长

DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

<强>短

DateTime.Now.ToString("yyyy-MM-dd");

答案 5 :(得分:0)

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

预定义模式检查: http://alexonasp.net/samples/stringformatting/

答案 6 :(得分:0)

您也可以尝试format(date.now,"yyyy-MM-dd HH:mm:ss)

相关问题