为什么转换为int时会从字符串中得到错误的值

问题描述

我正在尝试通过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;