将字符串转换为DateTimeOffset的最佳方法是什么?

9

我正在尝试将字符串转换为DateTimeOffset。我使用的是DateTimeOffset.Parse(string)。当字符串格式不正确时,Parse会抛出异常。它无法解析0000-00-00。

我想要一行代码来处理这种情况的最佳方式。如果输入为0000-00-00,则应将其转换为当前DateTimeOffset。

除了无法解析的0000-00-00之外,任何其他字符串都应更改为DateTimeOffset.Now。


您不能更改DateTimeOffset.Parse方法的逻辑。您可以编写一个帮助方法,该方法将检查值“0000-00-00”,并返回当前DateTimeOffset,否则尝试解析输入值为DateTimeOffset并返回相应的值。 - Chetan
@ChetanRanpariya,你的意思是使用DateTimeOffset.TryParse吗? - Sriman Saswat Suvankar
@Enigmativity 应该解析为当前的datetimeoffset。 - Sriman Saswat Suvankar
为什么它应该解析到当前DateTimeOffset?如果在您的设计中确实需要它,为什么不只是使用一个简单的if语句? - ProgrammingLlama
你为什么想让这成为一行代码呢?你可以通过将任何内容放入方法中来使其成为一行代码... - Jesse de Wit
显示剩余2条评论
3个回答

7

如果我理解你的问题正确,你正在寻找

DateTimeOffset dto = (input == "0000-00-00" ? DateTimeOffset.Now : DateTimeOffset.Parse(input));

编辑 根据你的澄清,所有无效日期应默认为当前时间,以下代码可实现此功能:

DateTimeOffset dto;
if(!DateTimeOffset.TryParse(input, out dto))
    dto = DateTimeOffset.Now;

@SrimanSaswatSuvankar - 所以任何无效的输入都应该是 DateTimeOffset.Now 吗?这听起来有点奇怪。你如何控制输入呢? - Enigmativity
这是我通过API从外部来源获取的数据,因此无法控制数据。 - Sriman Saswat Suvankar
@SrimanSaswatSuvankar - 这甚至更糟。如果您无法控制外部数据,那么您怎么知道他们发送给您的日期格式是有效的,但您没有正确解析它? - Enigmativity
@SrimanSaswatSuvankar - 将任何错误数据转换为默认值是不好的做法。您真的应该正确处理每个输入。 - Enigmativity
1
@Enigmativity:是的,但是坏数据的机会很少,如果我将其转换为默认值,则不会以任何方式妨碍我们,并且它完全符合要求。这些坏数据可能是来自其他系统的偶然情况,而这些系统并非我们自己的。因此,我们无法控制输入内容。 - Sriman Saswat Suvankar
显示剩余3条评论

4

您无法更改DateTimeOffset.Parse方法的逻辑。 您可以编写一个帮助程序方法,该方法将检查值“0000-00-00”,并返回当前DateTimeOffset,否则尝试将输入值解析为DateTimeOffset并返回相应的值。

public class DateTimeOffsetHelper
{
    public static DateTimeOffset FromString(string offsetString)
    {

        DateTimeOffset offset;
        if (!DateTimeOffset.TryParse(offsetString, out offset))
        {
            offset = DateTimeOffset.Now;
        }

        return offset;
    }
}

你可以按照以下方式使用它。
var offsetString = "2017-05-30";
var offset = DateTimeOffsetHelper.FromString(offsetString);

这应该有助于解决您的问题。

稍作修正。应该是!DateTimeOffset.TryParse....因为如果无法解析,则为DateTimeOffset.Now。 - Sriman Saswat Suvankar
1
TryParse 如何知道 "05" 是月份还是日期?如果传入的是 "2017-05-04" 呢? - Benhamine
TryParse函数期望"05"只是月份。如果该值大于12,则TryParse将返回false。对于"2017-05-04"的输出将是"5/4/2017",即"04-May-2017"。 - Chetan

1
这是一个相当简单的一行代码。
Func<string, DateTimeOffset> parseDateTimeOffset = input =>
    input == "0000-00-00" || DateTimeOffset.TryParse(input, out DateTimeOffset output)
        ? DateTimeOffset.Now
        : output;

虽然它是C#7。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接