#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;