用中间的文本格式化 DateTime

format DateTime with text in-between

我想以特定方式格式化我的 DateTime 对象。这是基础:

DateTime dt = new DateTime(2018, 11, 20, 15, 30, 5, 0);
Debug.WriteLine(dt.ToString("ddd MMM dd HH:mm:ss zzz yyyy", CultureInfo.InvariantCulture));

输出将是 Tue Nov 20 15:30:05 +01:00 2018。这几乎就是我想要的:我想要 string 变量 myText.

的值而不是 +01:00

所以如果 myText 的值为 "hello world",输出应该是:

Tue Nov 20 15:30:05 hello world 2018

所以我的问题很简单:我需要写什么来格式化zzz部分除外)但值string 中间变量?

我试过dt.ToString("ddd MMM dd HH:mm:ss " + myText + " yyyy", CultureInfo.InvariantCulture),但是对于myText = "hello world"它会输出

Tue Nov 20 15:30:05 3ello worl20 2018

myText 的内容将被视为格式化,就像其他内容一样。但我希望 myText 的内容按字面意思来理解。

您可以将文本用引号括起来 ('),它会输出您想要的格式。

dt.ToString("ddd MMM dd HH:mm:ss '" + myText + "' yyyy", CultureInfo.InvariantCulture);

// output
Tue Apr 02 12:37:49 hello world 2019

它与 hello 中的 hworld 中的 d 匹配,这就是您看到该结果的原因。

您可以查看 Microsoft 的 Custom date and time format strings,其中有一节(靠近底部)是关于引号的。在 DateTime 格式(或数字格式)中包含引号(单引号 ' 或双引号 ")会在结果字符串格式中引入字符串文字。

正如@Dmitry 在评论中指出的那样,如果 ' 出现在您的字符串中,您可能需要使用 myText?.Replace("'", "''")。另一种选择是像往常一样使用双引号和转义:

dt.ToString("ddd MMM dd HH:mm:ss \"" + myText + "\" yyyy", CultureInfo.InvariantCulture);

用多行来做这个是否可以接受?我认为你应该能够做这样的事情:

DateTime dt = new DateTime(2018, 11, 20, 15, 30, 5, 0);
string x = (dt.ToString("ddd MMM dd HH:mm:ss X yyyy", CultureInfo.InvariantCulture));
string z = x.Replace("X", "myText");
Console.WriteLine(x);
Console.WriteLine(Environment.NewLine);
Console.WriteLine(z);

我们在 dt.ToString() 中放置了一个 "X" 因为 "X" 不会被格式化,并且将作为我们的占位符用任何自定义文本替换值我们希望日期格式化后。