2017-10-10 54 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,是的,它被称为“让客户处理它” –