转换YYYY。(MM / 12)使用自定义日期格式

时间:2014-03-19 06:29:45

标签: c# date datetime

我正在解析包含几种不同格式的日期的表格。我已经确定了至少五种我需要处理的潜在日期格式。所以我目前的设置(简单的四种格式)基本上类似于以下内容:

CultureInfo cultureInfo = new CultureInfo("en-US");
string[] dateFormats = { "MM/yyyy", "M/yyyy", "yyyy/MM", "yyyy/M" };
if (!DateTime.TryParseExact(someDateString, dateFormats, cultureInfo,
                            DateTimeStyles.AllowWhiteSpaces, out someDate))
{
    throw new someException("Unable to parse date");
}

这很有效。但是,对于第五种格式,我不知道该怎么做。格式基本上是YYYY.(MM/12)。例如,如果提供了2014.25,则应将其解释为April 1, 2014

我已经通过standard/custom date format specifiers on MSDN进行了搜索,但是我没有看到任何关于在标准说明符之外添加自定义日期格式的参考(其中,一年的分数似乎没有是一个选择)。

是否有内置的方法来添加这种格式,还是我必须编写自己的解析器?我试图避免将其拆分为另一个解析器以保持相当标准化。值得庆幸的是,我似乎不必处理YYYY.MM,所以至少我应该能够使用someDateString.Contains('.')来检查这种日期格式。

2 个答案:

答案 0 :(得分:1)

恕我直言,没有自定义日期格式可以解决这个问题(过了一会儿我觉得很有意思)。所以,你必须编写自己的解析器。

为了它的乐趣,我做到了 - 我相信正确的方法是将0.25视为一年中的一小部分然后写一个小脚本。

基于秒的精确计算(甚至检查这是否是闰年)将类似于

var someDateString = "2014.25";
if(someDateString.Contains(".")) {
    var parts = someDateString.Split('.');
    var year = Int32.Parse(parts[0]);
    var secondsPerYear = DateTime.IsLeapYear(year) ? 31622400 : 31536000;
    var seconds = Double.Parse(parts[1])/100 * secondsPerYear;
    var newDate = new DateTime(year, 1, 1).AddSeconds(seconds);
}

这确实将确切日期(在本例中为4月2日)写入newDate。如果您需要整月,您当然可以使用新的DateTime(newDate.Year,newDate.Month,1)。

答案 1 :(得分:0)

我最终编写了一个解析器来执行此操作。

因为我不需要使用秒精度,所以我决定通过与Olaf的答案略有不同的方法处理月精度:

int[] dateSplit = someDateString.Split('.').Select(x => Convert.ToInt32(x)).ToArray();
int month = Convert.ToInt32(dateSplit[1] * 0.12);
if (!(month < 12))
    throw new someException;
DateTime newDate = new DateTime(dateSplit[0], month + 1, 1);

...这给了我4月1日的预期输出。这种方法显然存在一些局限性,特别是如果数据库格式也允许YYYY.MM