解析法语日期

Posted

技术标签:

【中文标题】解析法语日期【英文标题】:Parsing French Date 【发布时间】:2010-06-01 15:49:59 【问题描述】:

我正在尝试将法国日期解析为 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 【参考方案1】:

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

与您的示例输入最接近的custom format specifier 可能是这样的:

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:单引号表示格式说明符中的字符串文字。例如,您可以使用它在输出中直接插入一个 : 字符,而不是依赖于文化的时间分隔符(: 格式说明符代表)。 我从一个 RSSFeed pubDate 元素中获取这个日期,看起来制作提要的人没有正确缩写它。我想我必须使用良好的老式字符串操作来添加句点。感谢您的信息! @Edward:根据 RSS 规范,不应将 pubDate 本地化(“RSS 中的所有日期时间都符合 RFC 822 的日期和时间规范,...”)。告诉制作提要的人修复它,不要开始解决有问题的 RSS 提要。【参考方案2】:

我认为你会得到的最接近的是

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.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 日/月/年 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 高:毫米 高:毫米 H'h'mm HH:mm:ss H:mm:ss H'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,年年 MMMM,年年

【讨论】:

【参考方案3】:

日期名称和月份名称缩写不正确,它们需要一个句点。如果你可以按摩绳子,那么你可以让它工作:

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

【讨论】:

以上是关于解析法语日期的主要内容,如果未能解决你的问题,请参考以下文章

PHP:用法语转换日期

如何在 SQL 或 PHP 中获取不包括假期(法语)和工作日的最后三天

角度翻译 - 格式日期

在 android DatePickerDialog 中将语言设置为法语

datepicker : 使用法语 datepicker 时出错

如何在颤动中更改显示日期选择器的语言