2012-05-16 5 views
2

Я занимаюсь «переработкой» приложения, которое было запущено в PHP некоторое время назад. Участвующий разработчик покинул компанию довольно давно, и все попытки связаться с ним упали на обочину.Преобразование PHP в .Net C#

Мне не нужна помощь в преобразовании всего сайта в его довольно простое приложение. Однако мы интегрируемся с сервисом API (у кого плохо документирована документация), и у меня возникают проблемы с пониманием их строк dateTime.

Вот отрывок (единственный бит) о том, как они там используются.

" даты и времени выражается в виде числа, полученного из алгоритма с использованием день месяц год час минуты и секунды следующим образом:

date=year<<20; 
date|=month<<16; 
date|=day<<11; 
date|=hour<<6; 
date|=minute; 

Для того, чтобы распаковать дату из заданного числа выглядит следующим образом:

year=(date & 0xfff00000) >> 20; 
month=(date & 0x000f0000) >> 16; 
day=(date & 0x0000f800) >> 11; 
hour=(date & 0x000007c0) >> 6; 
minute=(date & 0x0000003f); 

"

Сейчас идет мой вопрос. Разработчик (и это рабочий пример) создал следующую функцию PHP, которая преобразует временную метку в требуемый формат. Я не уверен, что побитовая метка времени является «универсальным алгоритмом».

Я пробовал оглядываться и ничего не нашел.

/** 
* Converts a unixtime stamp to a bitwise timestamp 
* 
* @access public 
* @param mixed $unixtime 
* @return void 
*/ 
function convert_unixtime_to_bitwise($unixtime) 
{ 
    /*$year = date('Y', $unixtime); 
    $month = date('m', $unixtime); 
    $day = date('j', $unixtime); 
    $hour = date('G', $unixtime); 
    $min = date('i', $unixtime);*/ 

     $year = date('Y', $unixtime); 
    $month = date('m', $unixtime); 
    $day = date('j', $unixtime); 
    $hour = date('G', $unixtime); 
    $min = date('i', $unixtime); 

    $date = 0; 
    $date = $year << 20; 
    $date |= $month << 16; 
    $date |= $day <<11; 
    $date |= $hour <<6; 
    $date |= $min; 

    return $date; 
} 

/** 
* Converts a bitwise datestamp to a standard unixtime stamp 
* 
* @access public 
* @param mixed $timestamp 
* @return void 
*/ 
function convert_bitwise_to_unixtime($timestamp) 
{ 
    $dateline = array(); 

    $dateline['year'] = ($timestamp & 0xfff00000) >> 20; 
    $dateline['month'] =($timestamp & 0x000f0000) >> 16; 
    $dateline['day'] = ($timestamp & 0x0000f800) >> 11; 
    $dateline['hour'] = ($timestamp & 0x000007c0) >> 6; 
    $dateline['min'] = ($timestamp & 0x0000003f); 

    return mktime($dateline['hour'], $dateline['min'], 0, $dateline['month'], $dateline['day'], $dateline['year']); 
} 

Может ли кто-нибудь помочь мне преобразовать это в .Net в самые простые моды. В идеале я бы написал метод расширения для объекта datetime, чтобы вернуть «побитовое»? объект и методы расширения для побитовой метки времени в метку времени datetime. Я бы идеально в конечном итоге с чем-то похожим на bel ..

public static class Extensions 
{ 
    public static BitWiseDateStamp ToBitWiseDateStamp(this DateTime timeStamp) 
    { 
     return BitWiseDateStamp.New(timeStamp); 
    } 

} 

public class BitWiseDateStamp 
{ 
    private string _value; 

    public string Value 
    { 
     get { return _value; } 
     set { _value = value; } 
    } 


    public static BitWiseDateStamp New(DateTime date) 
    { 
     var b = new BitWiseDateStamp(); 

     var bitWiseStr = string.Empty; 

     //= Convert to bitwise string format... 

     b.Value = bitWiseStr; 
     return b; 
    } 

    public override string ToString() 
    { 
     return this._value; 
    } 

    public DateTime ToDateTime() 
    { 
     var date = DateTime.MinValue; 
     var dateStr = string.Empty; 

     //== Convert bitwise string to date string respresenation 

     DateTime.TryParse(dateStr, out date); 
     return date; 
    } 
} 

Я очень ценю любую помощь, которую любой может предоставить.

Приветствия,

Нико

ответ

2

Может быть, я что-то не хватает, но не будет это делать?

public class BitwiseDateStamp 
{ 
    private readonly int _value; 

    public BitwiseDateStamp(DateTime dt) 
    { 
     this._value = dt.Year << 20; 
     this._value |= dt.Month << 16; 
     this._value |= dt.Day << 11; 
     this._value |= dt.Hour << 6; 
     this._value |= dt.Minute; 
    } 

    public BitwiseDateStamp() : this(DateTime.Now) 
    { 
    } 

    public DateTime ToDateTime() 
    { 
     int year = this._value >> 20; 
     int month = (this._value & 0x000f0000) >> 16; 
     int day = (this._value & 0x0000f800) >> 11; 
     int hour = (this._value & 0x000007c0) >> 6; 
     int minute = this._value & 0x0000003f; 

     return new DateTime(year, month, day, hour, minute, 0); 
    } 

    public override string ToString() 
    { 
     return this._value.ToString(); 
    } 
} 

и

public static class DateTimeExtensions 
{ 
    public static BitwiseDateStamp ToBitwiseDateStamp(this DateTime dt) 
    { 
     return new BitwiseDateStamp(dt); 
    } 
} 
+0

Теперь я даже не понял, что это было легко конвертировать. Здесь я пытаюсь работать в совершенно разных усадьбе. Иногда ответ смотрит вам в лицо. Большое спасибо – Nico

1

Я не вижу необходимости в классе BitWiseDateStamp. Это может быть реализовано следующим образом:

public static class Extensions 
{ 
    public static ulong ToDateStamp(this DateTime dt) 
    { 
     return (dt.Year << 20 | dt.Month << 16 | dt.Day << 11 | dt.Hour << 6 |      dt.Minute); 
    } 

    public static DateTime FromDateStamp(this ulong stamp) 
    { 
     return new DateTime((stamp & 0xfff00000) >> 20, 
          (stamp & 0x000f0000) >> 16, 
          (stamp & 0x0000f800) >> 11, 
          (stamp & 0x000007c0) >> 6, 
          (stamp & 0x0000003f), 
          0 // 0 seconds 
          ); 
    } 

} 
+0

Хотя это также соответствовало бы законопроекту, я использую фактический объект, так как интеграция с сервисом API создается в отдельной сборке, которая будет использоваться во всех других проектах. Нам нужен фактический объект, который передается в отличие от использования только методов расширения. Это поможет свести к минимуму ошибку пользователя при передаче некорректных значений в методы, которые используют это. Теперь я добавил метод расширения в свою собственную сборку (отдельный проект), чтобы просто привязать ToBitwiseDate расширение к datetime. Я очень ценю время, которое вы взяли, чтобы написать этот ответ. Приветствия, Нико – Nico

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