解析法国日期

时间:2010-06-01 15:50:00

标签: c# datetime parsing culture

我试图将一个法国日期解析为一个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);

3 个答案:

答案 0 :(得分:6)

您只能解析(使用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)在名称后添加.和时区说明符{{1} })插入zzz

我认为不可能欺骗ToString生成所需的输出,因此也不能用ParseExact解析结果。我猜你必须使用普通的旧字符串操作自己解析字符串。

答案 1 :(得分: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.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 ':' 毫米 ':' ss.fffffffK
  •   
  • YYYY ' - ' MM ' - ' dd'T'HH ':' 毫米 ':' ss.fffffffK
  •   
  • ddd,dd MMM yyyy HH':​​'mm':'ss'GMT'
  •   
  • ddd,dd MMM yyyy HH':​​'mm':'ss'GMT'
  •   
  • YYYY ' - ' MM ' - ' dd'T'HH ':' 毫米 ':' SS
  •   
  • HH:MM
  •   
  • H:毫米
  •   
  • H'h'mm
  •   
  • HH:MM:SS
  •   
  • H:MM:SS
  •   
  • H'h'mm
  •   
  • H:毫米
  •   
  • 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 :(得分: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();
    }
}