ProgramingTip

XmlSerializer가 DateTime을 'YYYY-MM-DD hh : mm : ss'로 지정 화합니다.

bestdevel 2020. 11. 19. 21:50
반응형

XmlSerializer가 DateTime을 'YYYY-MM-DD hh : mm : ss'로 지정 화합니다.


일부 RESTful 서비스에 대한 XSD 스키마가 있습니다. xsd.exe도구 와 함께 C # 코드를 xs:date생성하는 경우 XSD 는 다음 코드를 생성합니다.

[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType="date")]
public System.DateTime time {
    get {
        return this.timeField;
    }
    set {
        this.timeField = value;
    }
}

XML을 객체로 deserialize 할 때 XmlSerializer모두를 사용 하는 것이 좋습니다. 내가 직면 한 한 문제는 서비스가 날짜가 형식화 될 것으로 예상 YYYY-MM-DD hh:mm:ss하고 XSD 생성 코드가 YYYY-MM-DD.

XSD를 수동으로 수정하여 xs:dateTime입력하면 생성 된 C # 코드에서 2010-08-20T20:07:03.915039Z.

기본적으로 구성 화를 생성 YYYY-MM-DD hh:mm:ss해야합니까? XSD에 할 일이 또는 생성 된 C # 코드를 변경하기 위해 할 수있는 일이 있습니까?


과거에는 datetime을 제어하기 위해 다음을 수행했습니다.

  • DateTime 속성을 무시하십시오.
  • 내가 원하는 방식으로 생성 화 / 탈 렬화하는 더미 속성을 만듭니다.

다음은 그 예입니다.

public class SomeClass
{
    [XmlIgnore]
    public DateTime SomeDate { get; set; }

    [XmlElement("SomeDate")]
    public string SomeDateString
    {
        get { return this.SomeDate.ToString("yyyy-MM-dd HH:mm:ss"); }
        set { this.SomeDate = DateTime.Parse(value); }
    }
}

사용 [XmlElement(DataType = "date")]속성은 서식을 필요 DateTime로하는 속성 값을 사용합니다.

MSDN에서 :

참고 :
publicationdate 필드에 주석을 추가하는 속성에는 DataType 속성이 있습니다. .NET Framework에는 xs : date 유형과 완전히 일치하는 유형이 없습니다. 가장 가까운 일치 항목은 날짜 및 시간 데이터를 저장하는 System.DateTime입니다. DataType 속성을 "날짜"로 지정하면 XmlSerializer가 DateTime 개체의 날짜 부분 만화됩니다.


IXmlSerializable인터페이스 구현 이 트릭을 할 생각 믿습니다 . 그런 다음 개체를 생성하고 역으로 개체화하는 방법을 제어 할 수 있습니다.


밀리 초 부분 만 지울 필요가있는 경우. 인용하다 :

.NET DateTime에서 밀리 초를 자르는 방법

그리고 기본적으로 다음과 같이하십시오.

  startDateTimeToUse = startDateTimeToUse.AddTicks(-(startDateTimeToUse.Ticks % TimeSpan.TicksPerSecond));
  endDate = endDate.AddTicks(-(endDate.Ticks % TimeSpan.TicksPerSecond));

이것이 다음과 같이 확인 가능합니다.

            <startDate>2015-10-31T12:13:04</startDate>
            <endDate>2016-11-10T12:13:06</endDate>

또한 밀리 초를 지우기 전에 다음을 수행하고 있음을 명시해야합니다 .

            var startDateTimeToUse = ssStartDateTime.ToUniversalTime();
            var endDate = DateTime.Now.ToUniversalTime();
            startDateTimeToUse = DateTime.SpecifyKind(startDateTimeToUse, DateTimeKind.Unspecified);
            endDate = DateTime.SpecifyKind(endDate, DateTimeKind.Unspecified);

이 시점에서 어떤 화에 영향을 미치는지 여부를 모르겠습니다.


위의 답변을 참조하지만 추가 비용 값이 null이 아닐 때만 출력을 원하면 (예 : XML maxOccurs = 0) 다음과 같이 행동 할 수 있습니다.

private System.DateTime? someDateField;

public string someDate
{
    get
    {
        return someDateField?.ToString("MM-dd-yyyy");
    }
    set
    {
        dobField = System.DateTime.Parse(value);
    }
}

참고 URL : https://stackoverflow.com/questions/3534525/force-xmlserializer-to-serialize-datetime-as-yyyy-mm-dd-hhmmss

반응형