2016-12-13 42 views
-2

I имеют следующие значения:Как преобразовать значение тикера в datetime?

Я попробовал следующее:

попытка 1:

public long? CommitmentStartDate { get; set; } 

    public long? CommitmentEndDate { get; set; } 

    public DateTime? CommitmentStartDateDate => new DateTime((CommitmentStartDate != null ? (long)CommitmentStartDate: Convert.ToInt64(DateTime.MinValue))); 

    public DateTime? CommitmentEndDateDate => new DateTime(CommitmentEndDate != null ? (long)CommitmentEndDate: Convert.ToInt64(DateTime.MinValue)); 

Это дает мне дату в изношенном г формат, я получаю это:

0001-01-02 16:42:30

0001-01-02 14:57:23

попытка 2:

static readonly DateTime _unixEpoch = 
     new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); 

    public static DateTime DateFromTimestamp(long timestamp) 
    { 
     return _unixEpoch.AddSeconds(timestamp); 
    } 

    public long? CommitmentStartDate { get; set; } 

    public long? CommitmentEndDate { get; set; } 

    public DateTime? CommitmentStartDateDate => DateFromTimestamp(CommitmentStartDate != null ? (long)CommitmentStartDate: Convert.ToInt64(DateTime.MinValue)); 

    public DateTime? CommitmentEndDateDate => DateFromTimestamp(CommitmentEndDate != null ? (long)CommitmentEndDate: Convert.ToInt64(DateTime.MinValue)); 

это дало мне аргумент исключениеOutOfRange.

Как это сделать?

EDIT:

Ожидаемые значения:

2014-06-11

2016-06-10

EDIT 2:

тики, которые приходят из дата

1402437600000 ----> 2014-06-11

1465509600000 ----> 2016-06-10

+0

Возможный дубликат [Как я могу конвертировать тиков формат даты?] (Http://stackoverflow.com/ вопросы/1489243/how-can-i-convert-ticks-to-date-format) – Nope

+0

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

+0

@ François Wahl Thats поток, который я использовал при попытке конвертировать это, было бы неплохо, если бы вы прочитали весь вопрос с кодом перед голосованием, чтобы закрыть – ThunD3eR

ответ

2

Ваши 2 образца разделены на два года, принимая разницу от этих тиков и разделяя их на 2, 365, 24 и 3600 листьев 1000, чтобы они составляли миллисекунды.

Быстрая проверка показывает, что они действительно основаны на 1-1-1970 так

//return _unixEpoch.AddSeconds(timestamp); 
return _unixEpoch.AddMilliSeconds(timestamp); 
+0

Во всяком случае, с показаниями OP показывает «тикает», результаты будут «2016-06-09 22: 00: 00» и «2014-06-10 22: 00: 00' – Pikoh

+1

Да, похоже, есть часовой пояс смещение, я получил базу 1-1-70, 02:00. Легко компенсировать, но всегда лучше иметь спецификации для ваших входящих данных. –

1

В этой части вы добавляете секунд:

public static DateTime DateFromTimestamp(long timestamp) 
{ 
    return _unixEpoch.AddSeconds(timestamp); 
} 

Если вы хотите передать тики, вам нужно добавить тики:

public static DateTime DateFromTimestamp(long timestamp) 
{ 
    return _unixEpoch.AddTicks(timestamp); 
} 

Но вы га чтобы быть уверенным, что ваши тики означают то же, что и .NET ticks. Один тик .NET - 100 наносекунд. Если ваш тик - это другое подразделение, вы должны сначала перенести его в .NET ticks.

1

Я использовал это расширение

public static DateTime FromUnixTicks(this double ms) 
{ 
    DateTime d1 = new DateTime(1970, 1, 1); 
    return d1.AddMilliseconds(ms).ToLocalTime(); 
} 

и образец:

1465509600000.0.FromUnixTicks() 

и преобразовать обратно

public static double ToUnixTicks(this DateTime dt) 
{ 
    DateTime d1 = new DateTime(1970, 1, 1); 
    DateTime d2 = dt.ToUniversalTime(); 
    TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks); 
    return ts.TotalMilliseconds; 
} 

мне нужно double здесь, но вы можете использовать long, я думаю.

 Смежные вопросы

  • Нет связанных вопросов^_^