문제
국제 날짜와 호환되는 날짜 상수를 선언하는 방법을 아는 사람이 있습니까?
난 노력 했어:
' not international compatible
public const ADate as Date = #12/31/04#
' breaking change if you have an optional parameter that defaults to this value
' because it isnt constant.
public shared readonly ADate As New Date(12, 31, 04)
해결책
명령문에 의해 생성된 IL을 보면
public const ADate as Date = #12/31/04#
다음이 표시됩니다.
.field public static initonly valuetype [mscorlib]System.DateTime ADate
.custom instance void [mscorlib]System.Runtime.CompilerServices.DateTimeConstantAttribute::.ctor(int64) = ( 01 00 00 C0 2F CE E2 BC C6 08 00 00 )
주의할 점은 날짜시간상수속성 int64 틱 수를 사용하는 생성자로 초기화되고 있습니다.이 틱 수는 컴파일 타임에 결정되므로 이 값이 런타임에 초기화될 때 현지화가 작동할 가능성은 거의 없습니다.내 생각 엔 오류는 const 초기화가 아닌 코드의 다른 날짜 처리와 관련된 것입니다.
다른 팁
마이크로소프트 문서에 따르면,
"날짜 리터럴을 숫자 기호(# #)로 묶어야 합니다.M/d/yyyy 형식으로 날짜 값을 지정해야 합니다(예: #5/31/1993#).이 요구 사항은 로케일, 컴퓨터의 날짜 및 시간 형식 설정과 무관합니다."
이것이 올바르지 않고 구문 분석이 현재 로케일의 영향을 받는다는 말씀이신가요?
편집하다: 4자리 연도로 시도해 보셨나요?
VB에서 Date 객체에 데이터를 저장하면 무언가를 비교하거나 내보내기를 시도할 때까지 세계화에 대해 걱정할 필요가 없습니다.
이건 괜찮아:
Dim FirstDate as Date = Date.UtcNow() 'or this: = NewDate (2008,09,10)'
Dim SecondDate as Date
SecondDate = FirstDate.AddDays(1)
이는 세계화 규칙을 가져오고 현재 스레드의 문화 형식으로 인쇄합니다.
HeaderLabel.Text = SecondDate.ToString()
이것은 나쁘다:
Dim BadDate as Date = CDate("2/20/2000")
실제로 -- 이 경우 CDate가 올바른 문화권(InvariantCulture)을 사용하도록 강제하는 경우에도 괜찮습니다.
Dim OkButBadPracticeDate as Date = CDate("2/20/2000", CultureInfo.InvariantCulture)
모든 것을 특정 문화권으로 강제하려면 실행 스레드 문화권과 UI 문화권을 원하는 문화권(en-US, 고정 등)으로 설정해야 합니다.
날짜를 문자열로 사용하여 작업을 수행하고 있지 않은지 확인하세요. 실제 Date 객체인지 확인하세요!
알았어, 네가 어디에서 왔는지 더 잘 이해해..
어떻습니까:
- 날짜 상수를 반환하는 정적 메서드를 만듭니다.이는 특정 DateTime 값으로 반환되므로 국제적인 문제를 극복합니다.
- 이제 VB6 시절의 선택적 매개변수가 기억납니다. 하지만 메소드를 오버로드할 수는 없나요?날짜 없이 오버로드된 메서드를 사용하는 경우 정적에서 가져오면 됩니다.
편집하다: 무슨 말인지 잘 모르겠고 코드 샘플을 원하시면 이 게시물에 댓글을 달아주시면 제가 하나 알려드리겠습니다.
좋아, 여기서 무엇을 하려는지 잘 모르겠습니다.
- 귀하가 게시하는 코드는 아니다 .NET을 포팅하려고 하시나요?
- DateTime은 상수로 선언될 수 없습니다.
- DateTime은 데이터 유형이므로 일단 초기화되면 초기화된 형식은 관련이 없습니다.
- 상수 값이 필요한 경우 항상 동일한 DateTime을 반환하는 메서드를 만듭니다.
예를 들어:
public static DateTime SadDayForAll()
{
return new DateTime(2001, 09, 11);
}
업데이트
도대체 그 모든 것을 어디서 구하는 겁니까?!
- 거기 ~이다 C#과 VB.NET의 차이점 중 하나를 강조합니다.
- 날짜 는 아니다 .NET 데이터 유형 - 날짜 시간 이다.
- VB.NET에서 DateTime 상수를 생성할 수 있는 것처럼 보이지만 제한 사항이 있습니다.
- 이 방법은 당신을 돕기 위해 존재했습니다. 왜냐하면 당신은 a에서 const를 생성할 수 없기 때문입니다. 변하기 쉬운 (즉.선택적 매개변수).그건 말도 안 돼요.