배경 (무시/건너 뛰기 확인) :(MS) DateTime을 Int로 인코딩하는 더 좋은 방법이 있습니까?
내가하고있는 일을하는 더 좋은 방법이 있어야한다고 생각하지만 그게 뭔지 모르겠다. 내 솔루션이 작동한다고 생각하지만 더 우아하고 빠르거나 다른 무엇인가가있는 경우에 대비해서 내가 물어볼 줄 알았다.
Html.DropDownList를 사용하는 MS Razor MVC로 웹 페이지를 개발하고 있습니다. 선택 목록 UI 컨트롤은 선택 항목을 표시 문자열로 정수 ID 코드에 매핑합니다. (은이라고 생각합니다. 문자열을 DateTime 값으로 매핑 할 수 있습니다.)
두 경우에 DateTime 개체로 저장되는 날짜 중에서 선택하고 싶습니다. ID 코드를 DateTime 값과 관련시키는 또 다른 테이블을 메모리에서 만들 수 있다는 것을 알았지 만 대신 (그리고 웹 페이지의 성가심에 대한 또 다른 해결 방법으로 날짜를 int로 인코딩하려고 할 수도 있기 때문에) 생각했습니다. 날짜를 int로.
는 문제 : 가장 다음 int 값으로 DateTime 개체의 날짜를 변환하는 방법을
나중에 다시 인코딩 INT에서 해당 날짜에 날짜 시간의 날짜를 설정합니다. 내 솔루션의 주요 추함은 DateTime은 읽기 전용 DayOfYear 함수를 제공하지만 날짜를 (Date, DayOfYear)로 설정하는 방법은 알 수 없으므로 루프가있는 메소드를 작성했습니다.이 메소드는 귀엽지 만 느려질 수 있습니다. .
MY 현재 (OK) 해결책 :
public int encodeDate(DateTime date)
{
return ((date.Year - 2012) * 400) + date.DayOfYear;
}
public DateTime decodeDateCode(int dateCode)
{
int year = (dateCode/400) + 2012;
int day = dateCode % 400;
// MS DateTime doesn't provide a direct reverse conversion for DayOfYear, so find it:
int month = 1;
int mThresh = DateTime.DaysInMonth(year, month);
while (day > mThresh)
{
day -= mThresh;
month++;
mThresh = DateTime.DaysInMonth(year, month);
}
DateTime dateValue = new DateTime(year, month, day);
return dateValue;
}
정말 감사합니다. 그것은 더 빨리 실행되어야하며, 웹 세션을 위해서만 생겨 현재 사건에 관한 것이기 때문에 1970 년보다 최근의 한 해 이후로 틱 할 수도 있습니다. – Dronz