Member 12955507 Ответов: 1

Как перевести военное время в стандартное?


как перевести военное время в стандартное по нижеприведенному коду ?

Что я уже пробовал:

DateTime ottimein, ottimeout;
DateTime pmtimein, pmtimeout;
DateTime amtimein, amtimeout;
DateTime extra;
amtimein = DateTime.Parse(txt1.Text + "AM");
amtimeout = DateTime.Parse(txt2.Text + "AM");
pmtimein = DateTime.Parse(txt3.Text + "PM");
pmtimeout = DateTime.Parse(txt4.Text + "PM");
ottimein = DateTime.Parse(txt5.Text + "PM");
ottimeout = DateTime.Parse(txt6.Text + "PM");
extra = DateTime.Parse(txtExtra.Text + "AM").AddHours(12);
TimeSpan ts = new TimeSpan(0);
var am = amtimein;
var amout = amtimeout;
TimeSpan diff = amout.Subtract(am);
var pmin = pmtimein;
var pmout = pmtimeout;
TimeSpan diffpm = pmtimeout.Subtract(pmtimein);
var otin = ottimein;
var otout = ottimeout;
TimeSpan diffot = ottimeout.Subtract(ottimein);
if (diff < ts)
{
var res = diff + TimeSpan.FromHours(12);
var res_s= diffpm;
var res_r=diffot;
var _s = res + res_s + res_r;
txtm.Text = res.ToString(@"hh\mm");
}
else
{
var res = diff;
var res_s = diffpm;
var res_r = diffot;
var _s = res + res_s + res_r;
txtm.Text = res.ToString(@"hh\mm");
}

Jochen Arndt

Я думаю, вы имеете в виду время Z(ulu), которое просто UTC (без часового пояса и DST).

Поэтому вы должны использовать ключевое слово " UTC " при поиске, чтобы найти то, что вам нужно, потому что ваш фрагмент кода не содержит никакой информации об используемом формате datetime.

Но есть общее правило при использовании datetimes:
Храните их, используя двоичные даты в UTC, и делайте как можно больше обработки с этими двоичными значениями. Только при отображении конверсии с использованием местного часового пояса и формата. Аналогично для пользовательского ввода, где строковый ввод должен быть в известном формате и известном часовом поясе (обычно это локальные настройки). Если возможно, используйте существующие элементы управления выбора, которые возвращают значения уже в двоичном формате.

1 Ответов

Рейтинг:
8

Philippe Mori

Научитесь писать читаемый код. Есть по крайней мере 4 вещи, которые делают ваш код трудным для чтения:
#1 Вы не используете отступы
#2 вы не добавляете несколько лишних пустых строк в соответствующих местах.
#3 Вы объявляете переменную, которую никогда не используете
#4 у вас есть много переменных, которые дублируют другие переменные.

Также:

* Вы должны обрабатывать неправильные пользовательские вводы с помощью TryParse и принимайте соответствующие меры, когда вход плохой.
* В реальном приложении вы должны учитывать тот факт, что пользователь также может захотеть ввести время в формате 24 часа.
* Вы, вероятно, неправильно обрабатываете дополнительное время, которое заканчивается между 12:00 и 12:59 включительно, поскольку вы систематически добавляете 12 часов.
* Код для каждого случая будет одинаковым, поэтому у вас должны быть функции, которые обрабатывают общий код.
* Как предполагается использовать extra, неясно, так как все остальные случаи, по-видимому, работают в парах... но для дополнительного вы систематически добавляете 12 часов.
* Ваш выходной формат, вероятно, не является ожидаемым. Вы, вероятно, хотите использовать @"hh\:mm" вместо.
* TimeSpan(0) бесполезно, так как для этого уже есть свойство: TimeSpan.Zero Если сделать код более эффективным и читабельным.

Из вашего вопроса не ясно, каков желаемый формат вывода. Похоже, что вы хотите вывести временной промежуток, чтобы военное и стандартное время не соответствовали вашему коду!

Вот рефакторизованный код, который делает по существу то же самое, что и Ваш (за исключением того, что я тестирую на плохие входные данные):

DateTime amtimein, amtimeout;
if (!DateTime.TryParse(txt1.Text + "AM", out amtimein))
{
	// Warn user that hour # 1 is not valid...
}
else if (!DateTime.TryParse(txt2.Text + "AM", out amtimeout))
{
	// Warn user that hour # 2 is not valid...
}
else
{
	TimeSpan diff = amtimeout.Subtract(amtimein);
	
	if (diff < TimeSpan.Zero)
	{
		diff += TimeSpan.FromHours(12);
	}

	var txtm.Text = diff.ToString(@"hh\:mm");
}