将本地化字符串转换为datetime

时间:2015-10-21 12:21:18

标签: c# .net string datetime format

我想将本地化字符串(最好是任何支持的语言)转换为日期时间对象。 该字符串是例如(在荷兰语):woensdag 3 juni 2015 9:12:14 uur CEST

本地化字符串的格式始终相同:[日名] [日] [月] [年] [小时] [分钟] [秒] [小时字面数] [时区] 提供给程序的字符串无法在主机应用程序上更改(没有足够的权限)。

我已经读过,在C#.NET中,我需要使用像InvariantCulture对象这样的东西来将DateTime对象更改为本地化的字符串日期。

然而,是否有可能走另一条路?如果可以,我的上述要求可以吗?

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

首先,DateTime是时区意识。它没有关于时区的任何信息。这就是为什么你需要将这个CEST部分解析为文字分隔符。 ( AFAIK ,除了逃避它之外没有办法解析它们)看起来uur在英语中的意思是“小时”,你需要将它指定为文字。

然后,您可以使用dddd d MMMM yyyy H:mm:ss 'uur CEST'"格式和nl-BE文化来解析字符串;

string s = "woensdag 3 juni 2015 9:12:14 uur CEST";
DateTime dt;
if(DateTime.TryParseExact(s, "dddd d MMMM yyyy H:mm:ss 'uur CEST'", 
                          CultureInfo.GetCultureInfo("nl-BE"),
                          DateTimeStyles.None, out dt))
{
    Console.WriteLine(dt); // 03/06/2015 09:12:14
}

肯定不想使用InvariantCulture来解析此字符串。这种文化是基于英语的,并将DayNames的英文名称保留为星期三等。

顺便说一句,Nodatime有ZonedDateTime structure,看起来它支持的时区是Zone property

答案 1 :(得分:0)

由于提出的原始问题下面的评论,我设法解决了这个问题。

通过使用字符串替换,我可以放弃本地化的'uur',它与CEST一起代表荷兰语。

以下代码为我做了诀窍:

CultureInfo nlculture = new CultureInfo("nl-NL");
string test = "woensdag 3 juni 2015 9:12:14";
DateTime dt = DateTime.ParseExact(test, "dddd d MMMM yyyy H:mm:ss", nlculture);
System.Windows.MessageBox.Show(dt.ToString());

回到其中一个要求,即支持多种语言。我可以(在再次检查我可以使用的东西之后)捕获使用过的语言,从而让我能够支持多种语言。

感谢大家的帮助

答案 2 :(得分:0)

以下代码应该有效。我收到错误但我认为这是因为我的计算机上安装了旧版本的VS

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Globalization;


namespace ConsoleApplication53
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime x = DateTime.ParseExact("3 june 2015 9:12:14 PM GMT", "d MMMM yyyy h:mm:ss tt Z", CultureInfo.InvariantCulture);
            string y = x.ToString("d MMMM yyyy h:mm:ss tt K", CultureInfo.CreateSpecificCulture("nl-NL"));
            string dutchTimeString = "3 juni 2015 9:12:14 uur CEST";

            DateTime date = DateTime.ParseExact(dutchTimeString, "d MMMM yyyy h:mm:ss tt Z", CultureInfo.CreateSpecificCulture("nl-BE"));

        }

    }
}