C# 本地化日期范围

C# 本地化日期范围,c#,.net,datetime,date,globalization,C#,.net,Datetime,Date,Globalization,有人知道如何使用C#本地化日期范围吗 特别是,我希望生成“智能”日期范围,以便消除冗余信息 这里有一些美国英语的例子 2009年8月至9月 2009年8月 2009年8月1日至9日 2009年1月1日至3月3日 2009年12月6日至2010年1月8日 据我所知,.NET Framework支持本地化日期,但不支持日期范围 使用System.Globalization.DateTimeFormatInfo中有关CultureInfo支持的Windows区域设置的信息,我能够(大部分时间)了解如何

有人知道如何使用C#本地化日期范围吗

特别是,我希望生成“智能”日期范围,以便消除冗余信息

这里有一些美国英语的例子

  • 2009年8月至9月
  • 2009年8月
  • 2009年8月1日至9日
  • 2009年1月1日至3月3日
  • 2009年12月6日至2010年1月8日
  • 据我所知,.NET Framework支持本地化日期,但不支持日期范围

    使用
    System.Globalization.DateTimeFormatInfo
    中有关
    CultureInfo
    支持的Windows区域设置的信息,我能够(大部分时间)了解如何执行第1项和第2项。第2项只是
    DateTime.ToString(DateTimeFormatInfo.YearMonthFormat)
    。使用
    YearMonthFormat
    我还能够推断出大多数语言的#1使用的格式。对于少数我做不到的人,我只是复制了这一年

    不幸的是,我不知道如何使用.NET框架完成项目3到5。Outlook格式范围使用这些格式,所以我希望可能有一些Win32 API可以做到这一点,但谷歌搜索“Win32日期范围本地化”并没有产生任何有用的结果

    我喜欢“智能范围格式化”提供的增强的可用性,我也希望不使用英文版Windows的客户也能获得同样的好处


    有人知道如何以依赖于文化的方式做到这一点吗?

    这是一个好问题,而且.NET framework和其他语言似乎也缺少这一点。我想结果的呈现取决于你的申请

    Outlook对输入日期有很好的理解(谷歌日历也是如此),但我个人还没有将这种形式的表达视为输出(例如,显示给用户)

    一些建议:

  • 坚持显示开始日期和结束日期,不要担心冗余
  • 滚你自己的…:-(
  • 我猜,从你的术语“本地化”来看,你计划将输出国际化,如果是这样的话,你将很难抓住所有的案例,那么它似乎不是存储在大多数典型国际化数据集中的信息

    从您的示例集中到英语,您似乎已经在代码中定义了许多规则:

  • 始终显示年份
  • 月份(至少其中一个)也始终显示
  • 案例3中不显示天数,这意味着开始日期为1日,结束日期为31日(例如,每月的每一天)
  • 如果开始/结束月份不同,则显示日期和月份
  • 如果两个日期因年份不同而不同,则在开始日期的基础上额外显示年份
  • 我知道上面所说的只是英语,但在我看来,在这个编辑器里,你看起来并不难翻滚,写太多东西

    编辑-我知道这不能回答原文-但是如果任何使用搜索引擎的人发现这个问题并想要一个英文版本。。。 这产生了与原始问题相同的输出(在我看来,9月几乎变成了9月):

    August - September, 2009
    August 1 - 31, 2009
    August 1 - 9, 2009
    January 1 - March 3, 2009
    December 6, 2009 - January 8, 2010
    

    如果我正确理解了您的代码,下面的代码将处理4和5

    public string GetDateRangeString(DateTime dt1, DateTime dt2)
    {
       DateTimeFormatInfo info = new DateTimeFormatInfo();
    
       string format1;
       string format2;
       format2 = info.YearMonthPattern;
       format1 = dt1.Year == dt2.Year ? format1 = info.MonthDayPattern :
                                                   format2;
       return string.Format("{0} - {1}", dt1.ToString(format1), dt2.ToString(format2));
    }
    

    我最终为此定义了自己的范围格式

    大部分情况下,我都是从LongDatePattern派生出来的。如果可能的话,我会根据谷歌日历和/或母语人士验证这些格式

    我还为时间范围(同一天内)生成了两种格式,一种用于同一12小时内,另一种用于同一12小时外的时间(对于使用24小时时间的区域性,这两种格式是相同的)。这些格式主要基于FullDateTimePattern

    在所有情况下,我尽可能地从所有格式中删除“日期名称”(星期一、星期二等)

    我很想在这里发布它们,但似乎堆栈溢出的人对html表有一种不合理的恐惧,因为他们不允许使用表标记。数据本质上是一个巨大的表。我对尝试使用CSS模拟表不感兴趣,所以我只是将表放在我自己的网站上。如果您感兴趣,可以在这里访问它:

    如果您真的感兴趣的话,我确实有一些关于我是如何导出很多格式的详细说明,包括哪些已验证,哪些尚未验证。如果您想要这些说明,请发送电子邮件至:

    contact@transactor.com


    我很乐意将它们发送给您。

    有意思的问题!我想您的意思是第5项说“…-2010年1月8日”,是吗?是的,我做了。很好。我编辑了这篇文章。谢谢。我最初是用自己的英语写的。代码很简单。问题是同一个日期字符串在不同的国家可能意味着不同的东西(2009年1月2日在瑞典的意思与在美国不同)。因此,我需要以本地日期格式显示日期,即使UI文本没有翻译。除了英语,我可能还可以用西班牙语显示日期,但仅此而已。我不懂日语、汉语、俄语、法语、各种印度语或Windows支持的任何其他语言。国际化并不是你想要的我妻子会说几种语言,但可以正式翻译成任何一种语言(只能译成英语)因为翻译需要得到母语为英语的人/思想家的批准。我自己做了一个简短的试验,但最初得到的英语结果与你不同……但我来自英国,在我看来,错误的日期格式……应该是“8月4日”而不是“8月4日”,想想“7月4日”、“7月4日”听起来是错误的和突然的!想想你的示例日期2009年1月2日-假设你使用DateTime应该不会有问题,只要你在解析日期字符串时知道本地,你就应该能够访问该date.Month和该date.Day而不必担心它
    public string GetDateRangeString(DateTime dt1, DateTime dt2)
    {
       DateTimeFormatInfo info = new DateTimeFormatInfo();
    
       string format1;
       string format2;
       format2 = info.YearMonthPattern;
       format1 = dt1.Year == dt2.Year ? format1 = info.MonthDayPattern :
                                                   format2;
       return string.Format("{0} - {1}", dt1.ToString(format1), dt2.ToString(format2));
    }