2017-01-20 7 views
0

Я пытаюсь изменить значение DateTime строки с помощью Offset. Это процедура, которую я попытался, но в конце, оба дня и времени & datetime1 распечатывают свои начальные значения. Мой желаемый выход для форматирования datetime1 в надлежащее смещение, так что она отражает DATETIMEФормат A Дата со смещением

01/10/2016 5:18 PM
01/10/2016 5:18 PM-05: 00

string datetime = "2017-01-10T17:18:00-05:00"; 
string datetime1 = "1/10/2016 3:18:00 PM"; 

DateTimeOffset dateTimeOffset = DateTimeOffset.Parse(datetime); 
TimeSpan tspan = dateTimeOffset.Offset; 
DateTimeOffset alteredDate = new  DateTimeOffset(Convert.ToDateTime(datetime1)).ToOffset(tspan); 

UAB = Convert.ToString(DateTimeOffset.Parse(alteredDate.ToString())); 

Console.WriteLine(datetime); 
Console.WriteLine(UAB); 
Console.ReadLine(); 

EDIT
При пошаговом через мой код, я заметил, что tpsan имеет значение -05:00 мог - знак быть то, что вызывает код не преобразовать правильно?

+0

Знаете, даты прекрасно подходят для использования как есть. Нет необходимости хранить их как строки, 'DateTime.ToString()'; будет отображать его в любом формате, который вы хотите в любое время. – Plutonix

+0

@Plutonix - Я согласен с вами, даты получены в виде укусов в файле, который я получаю –

ответ

-1

DateTimeOffset объект, который вы получите уже с поправкой на часовой пояс.

string output = ""; 

// Parsing with explicit timezones 
var withZeroOffset = DateTimeOffset.Parse("2017-01-10T17:18:00-00:00"); // parsed as UTC 
var withOffset = DateTimeOffset.Parse("2017-01-10T17:18:00-05:00"); // Parsed as specific timezone 
var withoutOffset = DateTimeOffset.Parse("2017-01-10T17:18:00"); // Parsed as my timezone 
output += "All Times:\n" + withZeroOffset + "\n" + withOffset + "\n" + withoutOffset + "\n\n"; 

// Modifying timezones 
var inputUtc = DateTimeOffset.Parse("2017-01-10T17:18:00Z").ToOffset(TimeSpan.Zero); 
output += "Time UTC: " + inputUtc + "\n"; 
var minusFive = inputUtc.ToOffset(TimeSpan.FromHours(-5)); 
output += "Time @ -5:00: " + minusFive + "\n"; 
var myOffset = TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now); 
var myTime = inputUtc.ToOffset(myOffset); 
output += "Time in my timezone: (" + myOffset.TotalHours + ":00): " + myTime + "\n"; 

Console.WriteLine(output); 

На моей машине с моим часовым поясом, я получаю этот выход:

All Times: 
1/10/2017 5:18:00 PM +00:00 
1/10/2017 5:18:00 PM -05:00 
1/10/2017 5:18:00 PM -08:00 

Time UTC: 1/11/2017 1:18:00 AM +00:00 
Time @ -5:00: 1/10/2017 8:18:00 PM -05:00 
Time in my timezone: (-8:00): 1/10/2017 5:18:00 PM -08:00 

Я предполагаю, что ваш явный сдвиг совпадает с фактическим часовым поясом, поэтому вы видите один и тот же ответ дважды. Чтобы явно изменить часовой пояс объекта DateTimeOffset, используйте .ToOffset().

+0

Я думаю, что OP хочет дать ему другое смещение. – CodingYoshi

+1

Когда вы собираете 'myOffset', вы делаете предположение, что смещение * current * всегда является правильным смещением для вашего часового пояса. Это опасное предположение, поскольку оно может измениться для летнего времени. Действительно, вы никогда не должны использовать класс 'TimeZone', но' TimeZoneInfo' вместо этого. Вы должны использовать 'TimeZoneInfo.ConvertTime', что не позволяет вам вообще называть' ToOffset'. –

+0

О, и в конце, вы предполагаете, что все смещения целые часы. В таких местах, как Индия, это будет «UTC + 05: 30». Существует множество ': 30' и нескольких смещений': 45', разбросанных по всему миру. –

1

Используйте другой конструктор:

DateTimeOffset alteredDate = 
    new DateTimeOffset(Convert.ToDateTime(datetime1), tspan); 

Вот документация:

// 
// Summary: 
//  Initializes a new instance of the System.DateTimeOffset structure using the specified 
//  System.DateTime value and offset. 
// 
// Parameters: 
// dateTime: 
//  A date and time. 
// 
// offset: 
//  The time's offset from Coordinated Universal Time (UTC). 
// 
// Exceptions: 
// T:System.ArgumentException: 
//  dateTime.Kind equals System.DateTimeKind.Utc and offset does not equal zero.-or-dateTime.Kind 
//  equals System.DateTimeKind.Local and offset does not equal the offset of the 
//  system's local time zone.-or-offset is not specified in whole minutes. 
// 
// T:System.ArgumentOutOfRangeException: 
//  offset is less than -14 hours or greater than 14 hours.-or-System.DateTimeOffset.UtcDateTime 
//  is less than System.DateTimeOffset.MinValue or greater than System.DateTimeOffset.MaxValue. 
public DateTimeOffset(DateTime dateTime, TimeSpan offset); 
+0

, это не добавляет смещение в datetime1, оно остается показом неправильного значения –

+0

Вы уверены? Это должно сработать. – CodingYoshi

+0

@RedLightGreenLight: Это действительно правильный ответ на то, что было задано. Если вы передадите 'DateTime' и' TimeSpan', он создаст 'DateTimeOffset' точно так же, как указано. Но если вы только переходите в 'DateTime', он сделает некоторые предположения о том, какое смещение вы хотите, основываясь на свойстве' Kind' 'DateTime', в которое вы проходите. Тогда' ToOffset' переключит смещение, а также местное время чтобы соответствовать - чего вы не хотели. Так что действительно вы должны иметь то, что попросили, если будете следовать этому ответу. –