【问题标题】: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

标签: c# datetime parsing culture


【解决方案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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-12-05
      • 1970-01-01
      • 2018-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多