解析法语日期

4

我试图将一个法国日期解析为DateTime对象,但迄今为止没有成功。有办法吗?

String foo = "mar, 20 avr 2010 09:00:00 -0500";

我已经尝试使用不同的文化解析和更改线程的文化。
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-CA",true);
CultureInfo culture = new CultureInfo("fr-CA",true);
DateTime.Parse(foo,culture,DateTimeStyles.AdjustToUniversal);

你可以尝试使用 DateTime.ParseExact - Steven
3个回答

6

当使用DateTime格式化时,你只能解析(使用Parse或ParseExact)你可以创建的内容。

与你的示例输入最接近的自定义格式说明符可能是这样的:

ddd, dd MMM yyyy HH:mm:ss zzz

代码:

CultureInfo culture = new CultureInfo("fr-CA", true);

var f = new DateTimeOffset(2010, 04, 20, 09, 00, 00, TimeSpan.FromHours(-5))
            .ToString("ddd, dd MMM yyyy HH':'mm':'ss zzz", culture);

这将产生以下结果:
"mar., 20 avr. 2010 09:00:00 -05:00"

正如您所看到的,短日期和短月份规范符(dddMMM)在名称后添加了一个,时区规范符(zzz)插入了一个:
我认为不可能欺骗ToString生成所需的输出,因此也无法使用ParseExact解析结果。 我想您必须使用普通的字符串操作自己解析字符串。

只是好奇,格式化字符串中的引号字符有什么作用? - Greg
1
@Greg:单引号在格式说明符中表示字符串字面量。例如,您可以使用它将“:”字符直接插入输出中,而不是依赖于区域设置的时间分隔符(这是“:”格式说明符的含义)。 - dtb
我从RSSFeed的pubDate元素中获取了这个日期,看起来制作这些feed的人没有正确地缩写它。我想我必须使用老式的字符串操作来添加句号。谢谢你的信息! - Edward
@Edward:根据RSS规范,pubDate不应该被本地化(“RSS中的所有日期时间都符合RFC 822的日期和时间规范…”)。告诉制作订阅源的人去修复它,不要开始绕过有问题的RSS订阅源。 - dtb

3
我认为你能得到的最接近的答案是:
DateTime.ParseExact("mar., 01 juin 2010 12:11:53 -04:00", "ddd, dd MMM yyyy hh:mm:ss zzz", culture); // extra period after "mar"
// or
DateTime.ParseExact("mardi, 01 juin 2010 12:12:33 -04:00", "dddd, dd MMM yyyy hh:mm:sszzz", culture ); // full day name

为什么DateTime.Parse不起作用:

DateTime.Parse的文档说明:

s参数必须包含当前区域性(DateTimeFormatInfo)中的一个格式,可以通过DateTimeFormatInfo.GetAllDateTimePatterns()方法返回的格式之一来表示日期和时间。

在我的电脑上使用此代码,我得到了以下格式。看起来你的格式不在列表中。

    CultureInfo culture = new CultureInfo("fr-CA", true);

    foreach( string dateTimePattern in culture.DateTimeFormat.GetAllDateTimePatterns())
    {
        Debug.WriteLine(dateTimePattern);
    }

- yyyy-MM-dd - yy-MM-dd - dd-MM-yy - yy MM dd - dd/MM/yy - d MMMM yyyy - d MMM yyyy - d MMMM yyyy HH:mm - d MMMM yyyy H:mm - d MMMM yyyy H' h 'mm - d MMM yyyy HH:mm - d MMM yyyy H:mm - d MMM yyyy H' h 'mm - d MMMM yyyy HH:mm:ss - d MMMM yyyy H:mm:ss - d MMMM yyyy H' h 'mm - d MMMM yyyy H:mm - d MMM yyyy HH:mm:ss - d MMM yyyy H:mm:ss - d MMM yyyy H' h 'mm - d MMM yyyy H:mm - yyyy-MM-dd HH:mm - yyyy-MM-dd H:mm - yyyy-MM-dd H' h 'mm - yy-MM-dd HH:mm - yy-MM-dd H:mm - yy-MM-dd H' h 'mm - dd-MM-yy HH:mm - dd-MM-yy H:mm - dd-MM-yy H' h 'mm - yy MM dd HH:mm - yy MM dd H:mm - yy MM dd H' h 'mm - dd/MM/yy HH:mm - dd/MM/yy H:mm - dd/MM/yy H' h 'mm - yyyy-MM-dd HH:mm:ss - yyyy-MM-dd H:mm:ss - yyyy-MM-dd H' h 'mm - yyyy-MM-dd H:mm - yy-MM-dd HH:mm:ss - yy-MM-dd H:mm:ss - yy-MM-dd H' h 'mm - yy-MM-dd H:mm - dd-MM-yy HH:mm:ss - dd-MM-yy H:mm:ss - dd-MM-yy H' h 'mm - dd-MM-yy H:mm - yy MM dd HH:mm:ss - yy MM dd H:mm:ss - yy MM dd H' h 'mm - yy MM dd H:mm - dd/MM/yy HH:mm:ss - dd/MM/yy H:mm:ss - dd/MM/yy H' h 'mm - dd/MM/yy H:mm - d MMMM - d MMMM - yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK - yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK - ddd, dd MMM yyyy HH':'mm':'ss 'GMT' - ddd, dd MMM yyyy HH':'mm':'ss 'GMT' - yyyy'-'MM'-'dd'T'HH':'mm':'ss - HH:mm - H:mm - H' h 'mm - HH:mm:ss - H:mm:ss - H' h 'mm - H:mm - yyyy'-'MM'-'dd HH':'mm':'ss'Z' - d MMMM yyyy HH:mm:ss - d MMMM yyyy H:mm:ss - d MMMM yyyy H' h 'mm - d MMMM yyyy H:mm - d MMM yyyy HH:mm:ss - d MMM yyyy H:mm:ss - d MMM yyyy H' h 'mm - d MMM yyyy H:mm - MMMM, yyyy - MMMM, yyyy

2

日期和月份的缩写不够规范,需要加上句点。如果您可以修改字符串,则可以使其正常工作:

using System;
using System.Globalization;

class Program {
    static void Main(string[] args) {
        String foo = "mar., 20 avr. 2010 09:00:00 -0500";
        var cvt = CultureInfo.GetCultureInfo("fr-CA").DateTimeFormat;
        var dt = DateTimeOffset.Parse(foo, cvt, DateTimeStyles.RoundtripKind);
        Console.WriteLine(dt);
        Console.ReadLine();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接