문제

가능한 복제 :
Unix 타임 스탬프를 DateTime으로 변환하는 방법과 그 반대의 경우가 있습니까?

다음 수업이 있습니다.

[DataContractAttribute]
public class TestClass
{
  [DataMemberAttribute]
  public DateTime MyDateTime { get; set; }
}

JSON은 다음과 같습니다.

{ "MyDateTime":"1221818565" }

JSON은 PHP 웹 서비스에서 반환됩니다.

내가해야 할 일은 해당 에포크 문자열을 유효한 c# dateTime으로 변환하는 것입니다. 이것을하는 가장 좋은 방법은 무엇입니까?

나는 이것을 할 수있다 :

[IgnoreDataMemberAttribute]
public DateTime MyDateTime { get; set; }

[DataMemberAttribute(Name = "MyDateTime")]
public Int32 MyDateTimeTicks
{
  get { return this.MyDateTime.Convert(...); }
  set { this.Created = new DateTime(...); }
}

그러나 이것의 문제는 MyDateTimeticks가 공개적이라는 것입니다 (개인으로 변경하는 것은 직렬화 과정에서 예외를 유발합니다).

도움이 되었습니까?

해결책

당신이 게시 한 내용을 마치고 비공개로 만드는 것은 나에게 잘 작동하는 것처럼 보였습니다.

[DataContract]
public class TestClass
{

    private static readonly DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);

    [IgnoreDataMember]
    public DateTime MyDateTime { get; set; }

    [DataMember(Name = "MyDateTime")]
    private int MyDateTimeTicks
    {
        get { return (int)(this.MyDateTime - unixEpoch).TotalSeconds; }
        set { this.MyDateTime = unixEpoch.AddSeconds(Convert.ToInt32(value)); }
    }

}

다른 팁

private DateTime ConvertJsonStringToDateTime(string jsonTime)
        {
            if (!string.IsNullOrEmpty(jsonTime) && jsonTime.IndexOf("Date") > -1)
            {
                string milis = jsonTime.Substring(jsonTime.IndexOf("(") + 1);
                string sign = milis.IndexOf("+") > -1 ? "+" : "-";
                string hours = milis.Substring(milis.IndexOf(sign));
                milis = milis.Substring(0, milis.IndexOf(sign));
                hours = hours.Substring(0, hours.IndexOf(")"));
                return new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(Convert.ToInt64(milis)).AddHours(Convert.ToInt64(hours) / 100);                 
            }

            return DateTime.Now;
        }

여기 내가 생각해 낸 것입니다. C#에서는 새 DateTime을 생성 하고이 DateTime에 '초'로 Epoch 값을 추가 해야하는 것 같습니다. 코드의 모습은 다음과 같습니다.

new System.DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(1221818565);

Visual Studio Remove Window를 사용할 때이 작업 결과를 디버거 콘솔에 인쇄했습니다.

{9/19/2008 10:02:45 AM}
    Date: {9/19/2008 12:00:00 AM}
    Day: 19
    DayOfWeek: Friday
    DayOfYear: 263
    Hour: 10
    Kind: Unspecified
    Millisecond: 0
    Minute: 2
    Month: 9
    Second: 45
    Ticks: 633574153650000000
    TimeOfDay: {10:02:45}
    Year: 2008

나는 당신의 질문이 PHP에 대한 것이라는 것을 알고 있지만 .NET JSON에 대한 "gotcha"에 주목하고 싶었습니다. 이 경우 추가 라인은 다음과 같아야합니다.unixEpoch.AddMilliseconds(Int64.Parse(date));

더 많은 정보: http://blogs.msdn.com/b/marcelolr/archive/2008/03/05/system-datetime-ticks-vs-json-date.aspx

당신이 원하는 것은 다음과 같습니다.

DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
DateTime dotnetTime = unixEpoch.AddSeconds(Convert.ToDouble(ticks));

어디 ticks PHP에 의해 당신에게 전달되는 가치입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top