문제

우리는 방금 새로운 서버로 이동했으며 모든 것이 잘 진행되고 있습니다. 그러나 이전에는 "dd/mm/yyyy"형식의 문자열을 날짜로 변환하려고 할 때 .NET 오류가 발생했습니다. 이제 로컬 web.config의 문화 설정을 변경했지만 글로벌이어야합니다. .

어디에서 변경합니까? machine.config를 가정했지만 이전 서버에서 친숙한 설정을 찾을 수 없었습니다.

아니면 서버 쪽을보고 기계의 문화를 EN-GB로 설정하는 설정을 찾아야합니까?

== 업데이트 == 지역 설정을 변경했지만 불행히도 여전히 실패합니다. machine.config 글로벌 설정이 있습니까? 현재 그것은 변하지 않고 실패하는 것 같습니다.

IIS7과 함께 Windows Server 2008을 사용하고 있습니다.

사용중인 문자열은 1 개의 오프 사이트에 대한 등록 양식의 마감일이므로 페이지에 하드 코딩됩니다.

실행중인 코드는 다음과 같습니다.

if (DateTime.Now > Convert.ToDateTime("26/04/2008 12:00"))

매우 간단하고 지금까지 백만 번 작동 했으며이 새로운 설정에서만이 오류가 발생합니다.

도움이 되었습니까?

해결책 2

결국 (이것이 이것이 가장 좋은 방법인지 확실하지 않습니다) IIS7 내에서 컴퓨터를 선택하고 세계화 설정을 EN-GB로 설정해야했습니다. 이것은이 문제를 해결했으며 지정되지 않은 한 앞으로 해당 문화의 다른 모든 웹 사이트를 유지할 것입니다.

컴퓨터 지역 설정을 영국으로 이미 변경했으며 문제를 해결하지 못했습니다.

그러나 나는 지금부터 날짜를 구문 분석하기 위해 문화를 지정한다는 Alfred의 제안을 앞으로 나아갈 것입니다.

다른 팁

서버를 마이그레이션 할 때는 이전과 동일한 지역 설정 (제어판)을 사용하는 것이 좋습니다. 그냥 그렇게하면 많은 문제를 피합니다.

새 서버가 다른 지역 설정을 기대하는 다른 응용 프로그램을 호스팅하려는 경우 또는 새로운 정책으로 인해 발생 해야하는 경우에는 불가능할 수 있습니다.

어쨌든 모든 구문 분석 및 ToString () 호출 중에 적용 가능한 위치를 명시 적으로 지정하는 것이 가장 좋습니다.

이에 대한 FXCOP (및 정적 분석) 규칙도 있습니다.


질문에 대한 새로운 정보를 반영하도록 업데이트되었습니다.

convert.todateTime은 "편의"방법이 다음과 같이 구현됩니다.


public static DateTime ToDateTime(string value)
{
    if (value == null)
    {
        return new DateTime(0L);
    }
    return DateTime.Parse(value, CultureInfo.CurrentCulture);
}

DateTime.parse를 전달하는 명시 적 CultureInfo (CultureInfo.currentCulture)를 전달합니다.

CultureInfo.currentCulture는 Thread.CurrentThread.currentCulture에서 가치를 얻습니다.

CultureInfo.currentCulture를 살펴 보려면 실제로 어떤 CultureNfo가 돌아 오는지 확인하고/또는 무슨 일이 일어나고 있는지 이해하기 위해 추가로 조사 할 수 있지만 반면에 귀하가 귀하를 추천합니다. 명시 적으로 지정합니다 Formatter는 문자열을 DateTime, Double 등과 같은 다른 데이터 유형으로 구문 분석 할 때 사용됩니다.

원래 대답에서 말했듯이, IforMatprovider가 부족한 것을 확인하기위한 FXCOP (정적 분석) 규칙이 있습니다. CA1305.

그래서 나는 당신이 줄을 따라 코드를 다시 작성하는 것이 좋습니다.


if (DateTime.Now > DateTime.Parse("26/04/2008 12:00", new CultureInfo("en-GB")))

문자열을 날짜로 변환 할 때마다 사용하려는 문화를 지정해야합니다.

당신이 사용해야하는 문화는 날짜가 어떤 문화로 형식화되는지에 따라 다릅니다. 예를 들어, 모든 날짜가 구문 분석하는 경우 슬로바키아 사람:

String s = "24. 10. 2011";

그런 다음 문자열이있는 것처럼 문자열을 구문 분석해야합니다. 슬로바키아 (슬로바키아) (sk-SK) 문화:

//Bad:
d = DateTime.Parse(s);

//Good:
d = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("sk-SK")); //Slovak (Slovakia)

날짜가 모두 있다면 Tajik (타지키스탄 키릴 릭), 당신은 그것을 그대로 구문 분석해야합니다 tg-Cryl-Tj:

String s = "24.10.11"

DateTime d = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("tg-Cryl-Tj"));

질문은 무엇입니까? 어떤 날짜 형식을 사용하고 있습니까? 서버의 로케일 설정에 의존해서는 안되며 원하는 형식을 결정해야합니다.

//Bad
String s = d.ToString();

//Good
String s = d.ToString(CultureInfo.CreateSpecificCulture("si-LK")); //Sinhala (Sri Lanka)

//s = "2011-10-24 12:00:00 පෙ.ව."

나는 당신이 영어로 모든 것을하는 것을 선호한다고 생각합니다. 그러나 어떤 영어 변형을 결정해야합니다.

  • en-IA (영어 인도) : 24-10-2011 15:19:52
  • en-BZ (영어 벨리즈) : 24/10/2011 03:19:52 PM
  • en-AU (English Austrailia) : 24/10/2011 3:19:52 PM
  • en-NZ (영어 뉴질랜드) : 24/10/2011 3:19:52 p.m.
  • en-GB (영국 영국) : 24/10/2011 15:19:52
  • en-ZA (영어 남아프리카) : 2011/10/24 03:19:52 PM
  • en-US (영어 미국) : 10/24/2011 3:19:52 PM

그러나 날짜를 문자열로 변환 할 때 어떤 문화를 사용할 것인지 결정할 수 없다면 날짜는 사용자에게 표시되지 않아야합니다. 불변 문화:

String s = "10/24/2011" //invariant culture formatted date

d = DateTime.Parse(s, CultureInfo.InvariantCulture); //parse invariant culture date

s = d.ToString(CultureInfo.InvariantCulture); //convert to invariant culture string
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top