将任何字符串格式化为字符串“;yyyy/MM/dd”;

本文关键字:字符串 MM dd yyyy 任何 格式化 | 更新日期: 2023-09-27 18:28:27

我有很多字符串,比如"20120117"answers"20120321"。我需要将其转换为一个新的字符串,格式为:"2012/01/17"answers"2012/03/21"。那么,有办法做到这一点吗?

我尝试:

string dateString = string.format("{0:d", "20120321");

string dateString = string.format("{0:yyyy/MM/dd", "20120321"); 

string dateString = int.Parse("20120321").ToString("yyyy/MM/dd");

我总是担心我达不到目标

那么,我可以这样做吗?

OBS:有没有一种方法可以做到这一点,而不需要解析到日期时间?

将任何字符串格式化为字符串“;yyyy/MM/dd”;

您必须首先解析DateTime对象中的这些值。

示例:

DateTime dt = DateTime.ParseExact("20120321", "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture);
var result = dt.ToString("yyyy/MM/dd");

在对其他答案发表评论后进行编辑:如果您不喜欢解析,因为它可能会抛出异常,那么您可以始终使用TryParse,如下所示:

DateTime dt;
bool success = DateTime.TryParseExact("20120321", "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out dt);
if (success)
{
    var result = dt.ToString("yyyy/MM/dd");
}

编辑2:使用具有多种格式的TryParseExact

DateTime dt;
string[] formats = { "yyyyMMdd", "yyyy" };
bool success = DateTime.TryParseExact("20120321", formats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out dt);
if (success)
{
    var result = dt.ToString("yyyy/MM/dd");
    Console.WriteLine(result);
}

当使用"20120321"作为输入值时,它将产生2012/03/21,当使用2012作为输入值则产生2012/01/01

DateTime.ParseExact("20120321", "yyyyMMdd", CultureInfo.CurrentCulture).ToString("yyyy/MM/dd")

您可以解析字符串,但此方法可以在没有任何额外代码的情况下进行验证。想象一下,收到"20120230"、"20110229"或任何其他无效日期。

根据您的评论:

有没有一种方法可以在不解析到日期时间的情况下做到这一点?

是的,当然。如果真的想通过系统传播坏数据,而不是强调它是不正确的,那么你肯定可以使用:

// Make sure we'll always be able to get a result whatever the input.
string paddedInput = input + "????????";
string mightBeBadWhoKnows = string.Format("{0}/{1}/{2}",
    paddedInput.Substring(0, 4), // The year, if we're lucky
    paddedInput.Substring(4, 2), // The month, if we're lucky
    paddedInput.Substring(6, 2)); // The day, if we're lucky

但是为什么不想发现坏数据呢?

您绝对应该解析数据。如果您希望在收到错误数据并采取适当措施后能够继续,请使用DateTime.TryParseExact。如果您对抛出异常感到高兴,请使用DateTime.ParseExact。我建议在解析和格式化时都使用不变的区域性,除非您真的想要一个对区域性敏感的输出。

使用DateTime.ParseExact转换为DateTime,然后在该实例上使用ToString进行格式化。

DateTime.ParseExact(dateString, "yyyyMMdd").ToString("yyyy/MM/dd");

编辑:使用插入:EDIT2:修复错误:-)

var newString = dateString.Insert(4, "/").Insert(7, "/");

只需使用字符串操作插入斜杠:

string input = "20120321";
string dateString =
  input.Substring(0, 4) + "/" +
  input.Substring(4, 2) + "/" +
  input.Substring(6);

string dateString = input.Insert(6, "/").Insert(4, "/");

如果是日期,请尝试以下操作:

DateTime.ParseExact("20120321","yyyyMMdd", null).ToString("yyyy/MM/dd", System.Globalization.DateTimeFormatInfo.InvariantInfo)

试试这个;

string dateString = DateTime.ParseExact("20120321", "yyyyMMdd",
                              null).ToShortDateString(); 

如果您的数据始终是相同的格式,并且您不需要验证它,您可以使用以下代码段来避免使用DateTime 解析它

var strWithInsert =  input.Insert(4,"/").Insert(7,"/");