问题描述
我正在尝试通过ModBus协议从系统中发送日期和时间。 问题是当我将其转换为int时,值更改为奇数。你能告诉我为什么吗?
这是我的代码:
var time = DateTime.Now;
string formattedTime = time.ToString("ss,mm,HH,dd,MM,yy");
int ss = formattedTime[0];
int mm = formattedTime[1];
int hh = formattedTime[2];
int dd = formattedTime[3];
int MM = formattedTime[4];
int yy = formattedTime[5];
解决方法
因为您要将单个字符转换为int。转换将按预期方式返回字符值。
作为补充,formattedTime[2]
代表一个逗号,而不是小时部分。
您的DateTime对象已经可以直接访问所有这些信息,而不必将其格式化为字符串并尝试取回信息。
因此,如果您只需要访问这些值,请尝试:
time.Seconds
如果您满意,所有日期组件都具有类似的属性。
,我给你的印象是你打算用这行
string formattedTime = time.ToString("ss,mm,HH,dd,MM,yy");
是要转换单个值.ToArray()
吗?
那不是你那样做。 .ToString()
方法返回字符串,而不是数组。因此,您无法按索引访问formattedTime
,就像数组一样,因为它不是数组。
因此,正如其他人所指出的,您所做的确实是在[i]
字符串的formattedTime
位置返回字符的字节值。
如果您很快想要按照您的意图将值分开,那么按照以下方法最容易使用DateTime
类对象的适当属性;
var time = DateTime.Now;
int ss = time.Second;
int mm = time.Minute;
int hh = time.Hour;
int dd = time.Day;
int MM = time.Month;
int yy = time.Year;
如果您坚持要将这些值放入数组,请遵循以下内容;
int[] formattedTime = new int[6];
formattedTime[0] = time.Second;
formattedTime[1] = time.Minute;
formattedTime[2] = time.Hour;
formattedTime[3] = time.Day;
formattedTime[4] = time.Month;
formattedTime[5] = time.Year;
如果您希望将其包含在最初打算的字符串中,请尝试;
string strFormattedTime = string.Join(",",formattedTime);
或者,虽然不如上述解决方案那么简洁,但更接近您的初衷;
var time = DateTime.Now;
string formattedTime = time.ToString("ss,yy");
var formattedArray = formattedTime.Split(","); // split on the ','
formattedArray = formattedArray.Select(c => c.Trim()).ToArray(); // trim leading spaces
var intFormattedArray = formattedArray.Select(c => Convert.ToInt32(c)).ToArray(); // convert to int array
然后您可以按照您的原始意图访问int;
int ss = intFormattedTime[0];
,
您可以直接从日期时间获取天,秒等。如果可以使用它,将避免处理日期时间的不同字符串表示形式。
var time = DateTime.Now;
int ss = time.Second;
int mm = time.Minute;
int hh = time.Hour;
int dd = time.Day;
int MM = time.Month;
int yy = time.Year;