응용 프로그램을 사용하는 사용자와 다른 시간대로 호스팅되는 웹 사이트가 있습니다. 이 외에도 사용자는 특정 시간대를 가질 수 있습니다. 다른 SO 사용자와 응용 프로그램이 어떻게 접근하는지 궁금합니다. 가장 분명한 부분은 DB 내부에서 날짜 / 시간이 UTC로 저장된다는 것입니다. 서버에있을 때 모든 날짜 / 시간은 UTC로 처리해야합니다. 그러나 극복하려는 세 가지 문제가 있습니다.
UTC로 현재 시간을 가져옵니다 (로 쉽게 해결
DateTime.UtcNow
).데이터베이스에서 날짜 / 시간을 가져 와서 사용자에게 표시합니다. 다른보기에서 날짜를 인쇄하기위한 많은 호출 이있을 수 있습니다. 이 문제를 해결할 수있는 뷰와 컨트롤러 사이의 일부 레이어를 생각하고있었습니다. 또는 사용자 정의 확장 방법을 사용 중입니다
DateTime
(아래 참조). 주요 단점은 뷰에서 날짜 시간을 사용하는 모든 위치에서 확장 메서드를 호출해야한다는 것입니다!또한와 같은 것을 사용하는 데 어려움이 있습니다
JsonResult
. 당신은 더 이상 쉽게 부를 수있는Json(myEnumerable)
이 될 것이다,Json(myEnumerable.Select(transformAllDates))
. 이 상황에서 AutoMapper가 도움이 될 수 있습니까?사용자로부터 입력 받기 (Local to UTC). 예를 들어, 날짜가있는 양식을 게시하려면 날짜를 UTC로 변환해야합니다. 가장 먼저 떠오르는 것은 커스텀을 만드는 것입니다
ModelBinder
.
뷰에서 사용하려고 생각한 확장 기능은 다음과 같습니다.
public static class DateTimeExtensions
{
public static DateTime UtcToLocal(this DateTime source,
TimeZoneInfo localTimeZone)
{
return TimeZoneInfo.ConvertTimeFromUtc(source, localTimeZone);
}
public static DateTime LocalToUtc(this DateTime source,
TimeZoneInfo localTimeZone)
{
source = DateTime.SpecifyKind(source, DateTimeKind.Unspecified);
return TimeZoneInfo.ConvertTimeToUtc(source, localTimeZone);
}
}
시간대를 다루는 것은 서버의 현지 시간이 예상 시간대와 크게 다를 수있는 많은 응용 프로그램이 이제 클라우드 기반이라는 점을 고려하면 흔한 일이라고 생각합니다.
이것은 이전에 우아하게 해결 되었습니까? 내가 놓친 것이 있습니까? 아이디어와 생각은 대단히 감사합니다.
편집 : 혼란을 없애기 위해 몇 가지 세부 사항을 추가한다고 생각했습니다. 현재 문제 는 db에 UTC 시간을 저장 하는 방법 이 아니라 UTC-> 로컬 및 로컬-> UTC에서 진행하는 프로세스에 관한 것입니다. @Max Zerbini가 지적했듯이 UTC-> 로컬 코드를보기에 넣는 것이 현명하지만 DateTimeExtensions
실제로 답을 사용하고 있습니까? 사용자로부터 입력을받을 때 날짜를 사용자의 현지 시간 (JS가 사용하는 시간이므로)으로 수락 한 다음 a ModelBinder
를 사용 하여 UTC로 변환 하는 것이 합리적 입니까? 사용자 시간대는 DB에 저장되며 쉽게 검색 할 수 있습니다.
ModelBinder
.