簡體   English   中英

格式化長日期時間字符串以刪除T字符

[英]Formatting long datetime string to remove T character

我有許多XML節點,它們將datetime對象輸出為字符串。

問題是當輸出時間戳和日期時它們用T字符粘合在一起。

這是一個例子

2016-01-13T23:59:59

當然,XML中的所有節點都是不同的類型,因此按名稱或類型進行分組是不可能的。 我認為我唯一的選擇是將模式與正則表達式匹配並以這種方式解決問題。

下面是XML如何工作的示例,您可以看到每個元素都被命名為不同的元素,但它們都遵循類似的模式,其中必須刪除日期和時間之間的T並替換空格。

<dates>
    <1stDate> 2016-01-13T23:59:59 </1stdate>
    <2ndDate> 2017-01-13T23:55:57 </2ndDate>
    <3rdDate> 2018-01-13T23:22:19 </3rdDate>
</dates>

像這樣輸出的理想解決方案

2016-01-13 23:59:59 
2017-01-13 23:55:57 
2018-01-13 23:22:19

我以前不必使用正則表達式,但我知道它是什么。 我一直試圖解碼這個備忘單是什么意思http://regexlib.com/CheatSheet.aspx?AspxAutoDetectCookieSupport=1但無濟於事。

UPDATE

//How each node is output
foreach (XText node in nodes)
{
    node.Value = node.Value.Replace("T"," "); // Where a date occurs, replace T with space. 
}

示例中提供的<date>元素可能包含XML格式的日期,但可能不包含單詞date作為名稱。

例如

<Start>  2017-01-13T23:55:57  </start>
<End>    2018-01-13T23:22:19  </End>
<FirstDate> 2018-01-13T23:22:19 </FirstDate>

我喜歡正則表達式解決方案的主要原因是因為我需要將日期字符串與可以確定其日期的模式匹配,然后我可以應用格式。

為什么不將該(完全有效的ISO-8601)日期時間解析為DateTime ,然后使用內置的字符串格式來生成可呈現的人類可讀日期時間?

if (!string.IsNullOrWhiteSpace(node.Value))
{
    DateTime date;
    if (DateTime.TryParseExact(node.Value.Trim(),
        @"yyyy-MM-dd\THH:mm:ss", 
        CultureInfo.InvariantCulture, 
        DateTimeStyles.AssumeUniversal, 
        out date)
    {
        node.Value = date.ToString("yyyy-MM-dd HH:mm:ss");
    }
}

我會用:

if (DateTime.TryParse(yourString))
{
     yourString.Replace("T", " ");
}

編輯

如果您只想替換字母“T”的第一個實例,就像我認為您在更新中建議的那樣。 您可以使用此擴展方法:

public static string ReplaceFirst(this string text, string search, string replace)
{
   int pos = text.IndexOf(search);
   if (pos < 0)
   {
      return text;
   }
   return text.Substring(0, pos) + replace + text.Substring(pos + search.Length);
 }

你會像以下一樣使用它:

yourString.ReplaceFirst("T", " ");

如果您仍想使用正則表達式執行此操作,則以下表達式應該可以解決這個問題:

# Positive lookbehind for date part which consists of numbers and dashes
(?<=[0-9-]+)
# Match the T in between
T
# Positive lookahead for time part which consists of numbers and colons
(?=[0-9:]+)

編輯

上面的正則表達式不會檢查字符串是否采用日期/時間格式。 這是一種通用模式。 要為您的字符串強加格式,請使用以下模式:

# Positive lookbehind for date part
(?<=\d{4}(-\d{2}){2})
# Match the T
T
# Positive lookahead for time part
(?=\d{2}(:\d{2}){2})

同樣,這將匹配正是你有串,但你應該用它來驗證日期/時間值,因為它會匹配無效的日期2015-15-10T24:12:10 ; 驗證日期/時間值使用DateTime.Parse()DateTime.TryParse()方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM