【问题标题】:Transform between datetime formats在日期时间格式之间转换
【发布时间】:2015-12-09 10:45:53
【问题描述】:

我面临一个问题,我需要将给定输入格式的日期转换为目标格式。在 C# 中是否有任何标准方法可以做到这一点?

例如,假设我们有 yyyy.MM.dd 作为源格式,目标格式是 MM/dd/yyy(当前文化)。

问题出现是因为我使用了一种优先考虑当前文化的解析策略,然后如果失败,它会尝试从已知格式列表中解析。现在假设我们有两个等效日期,一个在上面的源文化中 (2015.12.9),另一个在当前文化中 (9/12/2015)。然后,如果我们尝试解析这两个日期,第一种情况的月份将为 12,第二种情况下的月份为 9,因此我们有一个不一致的地方(它们应该意味着相同的确切日期)。

我相信如果存在它应该是

DateTime.Convert(2015.12.9, 'yyyy/MM/dd', CultureInfo.CurrentCulture). 

有什么想法吗?

编辑:

感谢大家的意见和建议,但是大多数人对我的问题的解释并不完全正确。你们大多数人回答的是给定格式的直接解析,然后转换为 CurrentCulture。

DateTime.ParseExact("2015.12.9", "yyyy.MM.dd", CultureInfo.CurrentCulture)

这仍将返回 12 作为月份,尽管它是 CurrentCulture 格式。因此,我的问题是,是否有任何标准方法可以将 yyyy.MM.d 中的日期转换为 MM/dd/yyy 格式,以便月份现在位于正确的位置,THEN 在目标文化中解析它。这样的功能很可能不存在。

【问题讨论】:

  • 或者,Datetime.TryParse 获取格式信息(链接页面上的示例)。
  • 如果当前文化是yyyy-mm-dd,传入日期是09/12/2015,你会怎么做?你无法知道传入日期是mm/dd/yyyy还是dd/mm/yyyy
  • 没错。我放弃了这个。这是我的主管的要求,但我只是让他相信这是不可能的,我们必须克服这个问题的唯一方法是检测数据中给定日期时间所持有的格式,然后重新启动解析,强制使用它直到找到正确解析所有数据的格式。
  • 您应该在第一句话中更加具体,因为“以任何格式”是一个非常普遍的问题,正如 Matthew Watson 指出的那样,您在这里遇到了逻辑上的不一致,例如 dd/mm 和 mm/dd 所以它几乎不可能,你的第二句话表明你有一个单一的输入格式,如图所示。您能否将问题缩小到特定的输入格式?
  • @JPK,我的编辑是否澄清了这一点?

标签: c# date datetime


【解决方案1】:

DateTime.ParseExact 就是你要找的东西:

DateTime parsedDate = DateTime.ParseExact("2015.12.9", "yyyy.MM.d", CultureInfo.InvariantCulture);

如果您对输入字符串没有信心,则最终使用DateTime.TryParseExact

【讨论】:

【解决方案2】:

我知道已经很晚了,但如果你允许的话,我会试着稍微深入解释一下..

我遇到了一个问题,我需要以任何格式转换日期 到一个目标。

没有任何格式的日期DateTime 没有 any 隐式格式。它只有日期和时间值。看起来您有一个格式为日期的string,并且您想用不同的格式转换另一个string

在 C# 中是否有任何标准方法可以做到这一点?

是的。您可以先将stringDateTime.ParseExactDateTime.TryParseExact 以特定格式解析为DateTime,然后生成它的string 以不同格式表示。

例如,我们有 yyyy.MM.dd 作为源格式,而 目标格式为 MM/dd/yyy(当前文化)。

我不明白这句话中当前文化的含义是什么,我假设你想要yyyy而不是yyy,但你可以像我上面描述的那样生成它;

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的。你strings。并且那些格式化的字符串不能属于 any 文化。当然,所有文化可能解析或生成具有相同格式格式的不同字符串表示,格式不属于任何文化。

我假设您有 2 个不同格式的不同字符串,并且您想解析输入,无论它来自哪一个。在这种情况下,您可以使用DateTime.TryParseExact overload,它将所有可能格式的字符串数组作为参数。然后使用MM/dd/yyy 格式和将/ 作为DateSeparator 的文化(如InvariantCulture)生成它的字符串表示形式。

string s = "2015.12.9"; // or 9/12/2015
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));
}

【讨论】:

  • 对不起,我不够明确,日期是字符串,但它们可以是任何格式,这是未知的;在当前的文化解析失败时检测到它。这是,我做一个 DateTime.TryParse(s, formats, CultureInfo.CurrentCulture, out datetimevalue) 然后如果失败我做 DateTime.TryParseExact(str, dateFmts,culture, out datetimevalue)
  • @user3853059 很抱歉,您可以使用单一方法解析所有可能的格式化字符串。您必须知道您拥有哪种格式字符串,这样才能成功解析。如果你从某个地方得到这个作为输入,那么在 UI 端使用一些验证可能会更好。除此之外,据我所知不可能。
  • @Downvoter 至少愿意发表评论,这样我才能看到我可能哪里出错了?
【解决方案3】:

最简单且最好的方法是使用 .ToString() 方法
看这段代码:

DateTime x =DateTime.Now;  

要转换它,只需这样写:

x.ToString("yyyyMMdd")//20151210
x.ToString("yyyy/MM/dd)//2015/12/10
x.ToString("yyyy/MMM/dd)//2015/DEC/10  //Careful About M type should be capital for month .  

希望有帮助

【讨论】:

    猜你喜欢
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多