2011-09-10 5 views
4

어쩌면 대답이 너무 분명해 보일 수도 있지만 어쨌든 물어볼 위험이 있습니다..NET DateTime을 저장하고 시간대를 완전히 무시하십시오.

.NET 웹 응용 프로그램의 사용자가 날짜/시간을 입력하고 Oracle 데이터베이스에 저장하도록 허용하고 해당 시간대와 관계없이 항상 입력 된 원본 버전으로 표시됩니다. 사용자가 따라서 캘리포니아의 한 사용자가 2PM을 입력하고 메릴랜드의 다른 사용자가 2PM을 입력하면 둘 다 일본의 사용자에게 2PM으로 표시됩니다. 웹 사용자와 웹 클라이언트 사용자 (웹 서비스를 통해 연결됨)의 두 가지 유형의 클라이언트가 가능합니다.

대부분의 응용 프로그램이 걱정하는 모든 시간대 스마트를 완전히 깨고 싶은 것처럼 생각하십시오.

문자열로 저장하고 싶지 않습니다. 시간과 분을 추가/제거 할 수있는 날짜 시간을 원합니다.

편집 :

This

는 기본적으로 내가 가진 된 정확한 문제였다.

+0

관련 질문 : HTTP : //stackoverflow.com/q/2532729/1583 – Oded

+0

당신은 정확히 어떤 어려움을 겪고 있습니까? – Oded

+0

언젠가 당신은 언젠가 깊이 후회할 것이 95 %의 확률을 가지고 있습니다. 그러나 구현하기는 쉽지 않으며 변환하지 않고 사용자가 입력 한 시간을 로컬로 사용하면됩니다. DateTime.Parse() 문자열을 얻으면. 서버에서이 작업을 수행 할 수 없으며 인터 튜브가 시작된 위치를 알 수 없습니다. –

답변

8

항상 DateTime을 UTC 형식 (범용)으로 저장해야합니다. 당신이 그것을 표시 할 때 어느 때 어느 timezone 당신이 원하는 경우 선택할 수 있습니다,이 경우에 위치를 기반으로하지 않고 모든 사용자에 대해 수정할 수 있습니다.

// when recording date time 
DateTime utcDateTime = DateTime.UtcNow; 

// parse DateTime back out from string 
DateTime utcDateTime = DateTime.SpecifyKind(DateTime.Parse(dateStr), 
              DateTimeKind.Utc); 

// localized DateTime 
DateTime localDate = utcDateTime.ToLocalTime(); 

// fixed DateTime based on timezone 
string timeZoneKey = "New Zealand Standard Time"; 
TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneKey); 
DateTime nzlocalDate = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, timeZone); 

현지화 된 날짜를 저장하면 일광 절약과 같은 일이 발생할 수 있습니다.

+0

가난하게 말한 질문을 토대로이 질문을 최선의 대답으로 받아들입니다. 응용 프로그램에서 수행해야하는 작업이지만 일부 아키텍처 문제를 해결해야합니다. 또한 .NET 2.0에 포함되어 있으므로 TimeZoneInfo를 사용할 수 없습니다. – Rake36

0

사용자가 입력/선택 한대로 DateTime을 저장하면 방금 저장됩니다. 거기에 표준 시간대 정보가 저장되지만, 사용자는이 표준 시간대 정보로 수행하는 작업을 제어합니다.

예를 들어 화면/파일 등에 출력하고 싶을 때는 문자열로 포맷해야합니다.

DateTime date = DateTime.Now; 
string output = date.ToString("d", CultureInfo.InvariantCulture); 

다른 작업이 다른 취급이 필요합니다,하지만 당신은 각각의 경우에 발생하는 지정해야합니다 : 당신이 CultureInfo.InvariantCulturethis ToString overload를 사용하는 경우와 같이이 현재의 문화와 출력 날짜를 무시해야합니다.

+1

내가 잘못 본 것이 아니라면 문자열 형식이 아닌가? 난 그냥 시간대 조작을 모두 무시하고 싶습니다. – Rake36

+0

@ 레이크 - 나는 분명히하려고 노력할 것입니다. – ChrisF

0

시간이 중요한 수정이 있었고 SpecifyKind가 적절한 TimeSpan 비교를 할 수 없었습니다. 내 상황에서, 가장 빠른 해결책은 간단하게, 내가 (00:00:00)이었다과 비교 된 날짜 시간으로, 시간에서 시간, 분, 초를 제거하는 것이었다

DateTime eventDateTime = (DateTime)row["event_date"]; 
eventDateTime = eventDateTime.AddHours(-1 * eventDateTime.Hour).AddMinutes(-1 * eventDateTime.Minute).AddSeconds(-1 * eventDateTime.Second); 
관련 문제