2017-10-10 59 views
-11

我已經解析了從Api到日期字符串及其數據的響應。日期字符串顯示爲:C#如何按字符分隔字符串字符

"201710010900000" 

什麼,我試圖做的是轉換成可以通過datemm/dd/yyyy讀取做到這一點

我必須搶前4個字母爲一年的格式這一點,接下來的2個爲月,下2個爲天。理想情況下將它們分成日期,月份,日期等單獨的字符串。這樣它可以被轉換成一個字符串。

string reDate = (month + "/" + day + "/" + year); 

有沒有辦法單獨調用字符串的每個字符,還是什麼話來做到這一點的最好方法是什麼?

+1

字符串是字符數組。只需重複一遍即可。你不需要這樣做,如果你想把它當作日期來解析的話,你應該這樣做。只需使用'DateTime.ParseExact' –

+1

'將其解析爲'DateTime'並將其格式化爲所需的輸出格式? – Fildor

+0

每個字符串都會有所不同,因爲我從列表中調用。當前格式是yyyymmddttttttt。 –

回答

8

一個字符串是一個字符數組。就在它遍歷或使用一個索引,例如:

var someChar="201710010900000"[0]; 

你並不需要做的,如果你想,雖然這個分析的日期,你應該。只要使用DateTime.ParseExact,如:

var input="201710010900000"; 
var format="yyyyMMddHHmmssf"; 
var date=DateTime.ParseExact(input,format,CultureInfo.InvariantCulture); 

其他重載允許指定多種格式,例如this one

如果轉換失敗,ParseExact將拋出異常。如果你期望這是經常發生的事情,你可以使用TryParseExact

var styles=DateTimeStyles.None; 
var culture=CultureInfo.InvariantCulture; 
if (DateTime.TryParseExact(input,format,culture,styles,out var date)) 
{ 
    //Do something with the date 
} 

一旦你的DateTime值,您可以使用the standard string formatting mechanisms生成你想要的格式的字符串,在你想要的文化。

如果你想有一個美國式的短日期,你可以寫任何如下:

var targetCulture = CultureInfo.GetCultureInfo("en-US"); 
var text1=date.ToString("d",targetCulture); 
var text2=String.Format(targetCulture,"This is my date: {0:d}",result); 
6

DateTime.ParseExactDateTime.TryParseExact是爲這個目的而作出:

DateTime dt; 
bool validDate = DateTime.TryParseExact("201710010900000", "yyyyMMddHHmmssf", null, DateTimeStyles.None, out dt); 

要分開的日子,月等你只需要使用可用的屬性:

int year = dt.Year; 
int month = dt.Month; 
int day = dt.Day; 
int hour = dt.Hour; 

如果你想返回字符串格式:month+"/"+ day+"/"+year使用DateTime.ToString

string returnString = dt.ToString("MM/dd/yyyy", CultureInfo.InvariantCulture); 
+0

'MM'是月份,'mm'是分鐘,兩個都是前導零。 – BurnsBA

+1

我記得幾年前曾經提出'/'的建議。有些文化*不會使用'/'作爲日期分隔符,例如俄語。 'InvariantCulture'只是「發生」使用美式樣式 - 只需使用'd'格式就會產生'MM/dd/yyyy' –

1

如果你計劃在未來,你可以嘗試這樣的迴應「迭代」:

var input = "201710010900000"; 
var year = Convert.ToInt32(input.Substring(0, 4)); 
var month = Convert.ToInt32(input.Substring(4, 2)); 
var day = Convert.ToInt32(input.Substring(6, 2)); 
var hour = Convert.ToInt32(input.Substring(8, 2)); 
var minutes = Convert.ToInt32(input.Substring(10, 2)); 
var seconds = Convert.ToInt32(input.Substring(12, 2)); 

var date = new DateTime(year, month, day, hour, minutes, seconds); 
Console.WriteLine(date); 

我希望它能幫助,

另一個問題是創建一個新日期來指定輸入格式,就像其他人在這裏回答的(並且公平地說是一個非常好的方法)。

+0

你錯過了末尾的單個'0' – Toshi

+1

這不是迭代。這些是昂貴的子串操作。如果OP真的想迭代以避免生成子字符串,那麼這就是*不應該完成的事情。 –

+0

這是100%真 – Juan

3

ParseExactDateTime,然後它表示爲一個String

string source = "201710010900000"; 

    string result = DateTime 
    .ParseExact(source, "yyyyMMddHHmmssf", CultureInfo.InvariantCulture) 
    .ToString("MM'/'dd'/'yyyy"); 
+0

''/'':D。我知道至少有一種文化使用'.'而不是'/'。煩人。打破了不少流行的CSV解析器,讓我告訴你! –

+0

@PanagiotisKanavos是的,如果只有一個標準... – Fildor

+0

@Fildor,是的,它被稱爲「讓客戶處理它」 –