почему я получаю неправильные значения из строки при преобразовании в int

#c# #.net #modbus

#c# #.net #modbus

Вопрос:

Я пытаюсь отправить по протоколу 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];
  

Комментарии:

1. потому что он возвращает только символ в байтах.

2. Добавьте ваше время непосредственно в ваши переменные в требуемом формате «var ss = int.Parse(time. toString(«ss»));»

3. formattedTime[0] является первым char в строке. char неявно преобразуется в int , но возвращает значение символа ASCII, которое не соответствует вашим ожиданиям.

Ответ №1:

Потому что вы преобразуете отдельные символы в int. Преобразование работает, как и ожидалось, возвращая значение символа.

В качестве дополнительного замечания formattedTime[2] соответствует запятой, а не компоненту часов.

У вашего объекта DateTime уже есть вся эта информация, доступная напрямую, без необходимости форматировать ее в строку и пытаться получить информацию обратно.

Итак, если вам просто нужно получить доступ к значениям, попробуйте : time.Seconds

Если вас это устраивает, для всех компонентов date существуют аналогичные свойства.

Ответ №2:

У меня создается впечатление, что ваше намерение с этой строкой

 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, mm, HH, dd, MM, 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];
  

Комментарии:

1. Большое вам всем спасибо, это было очень полезно.

2. @ShayAvitapl если какой-либо из ответов ответил на ваш вопрос, выберите его в качестве ответа на ваш вопрос, это поможет процессу SO?

Ответ №3:

Вы можете получить дни, секунды и т.д. непосредственно из 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;