我知道现在有点晚了,但如果你让我解释一下,我会尽力让它更深入。
我遇到了一个问题,需要将任何格式的日期转换为目标格式。
不存在所谓的 任何格式的日期。一个 DateTime
没有 任何 隐式格式。它只有日期和时间值。看起来你有一个被格式化成日期的 string
,并且你想将另一个 string
转换为 不同的 格式。
在 C# 中有没有标准的方法可以做到这一点?
有的。你可以使用 DateTime.ParseExact
或 DateTime.TryParseExact
先将你的 string
解析为特定格式的 DateTime
,然后使用不同的格式生成它的 string
表示。
作为一个例子,假设我们有yyyy.MM.dd作为源格式,目标格式是MM/dd/yyyy(当前文化)。我不理解这句话中“当前文化”的意思,我认为你想要的是yyyy而不是yyy,但你可以按照我上面描述的方式生成它。请注意,保留HTML标签。
string source = "2015.12.9";
DateTime dt = DateTime.ParseExact(source, "yyyy.MM.d", CultureInfo.InvariantCulture);
string target = dt.ToString("MM/dd/yyyy", CultureInfo.InvariantCulture); // 12/09/201
问题出在我使用了一种解析策略,该策略优先考虑当前文化,如果失败则尝试从已知格式列表中解析。
由于您没有展示任何解析策略,并且.NET Framework中没有DateTime.Convert方法,因此我无法进行任何评论。
现在假设我们有两个等效的日期,一个在上述源文化中(2015.12.9),另一个在当前文化中(9/12/2015)。然后,如果我们尝试解析这两个日期,第一个月份将是12,而第二个月份将是9,所以我们有一个不一致性。
再次强调,您没有DateTime。您有字符串。这些格式化字符串不能属于任何文化。当然,所有文化可能会使用相同的格式解析或生成不同的字符串表示形式,但格式并不属于任何文化。
我假设你有两个不同格式的字符串,想要解析输入无论它来自哪一个。在这种情况下,你可以使用
DateTime.TryParseExact
overload,它将所有可能的格式作为参数传递给字符串数组。然后使用
MM/dd/yyy
格式和具有
/
作为
DateSeparator
的区域设置(例如
InvariantCulture
)生成它的字符串表示形式。
string s = "2015.12.9";
string[] formats = { "yyyy.MM.d", "d/MM/yyyy" };
DateTime dt;
if (DateTime.TryParseExact(s, formats, CultureInfo.InvariantCulture,
DateTimeStyles.None, out dt))
{
Console.WriteLine(dt.ToString("MM/dd/yyyy", CultureInfo.InvariantCulture));
}
yyyy-mm-dd
,而传入的日期是09/12/2015
,你会怎么做?你无法知道传入的日期是mm/dd/yyyy还是dd/mm/yyyy。 - Matthew Watson