Unix Timestamp와 .NET DateTime 간의 상호변환

Posted 2008/05/09 14:13 by 길버트

Unix Timestamp를 .NET DateTime으로 변환할 때

static DateTime ConvertFromUnixTimestamp(int timestamp)
{
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    return origin.AddSeconds((double)timestamp);
}

.NET DateTime을 Unix Timestamp로 변환할 때

static int ConvertToUnixTimestamp(DateTime date)
{
    DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    TimeSpan diff = date - origin;
    return (int)Math.Floor(diff.TotalSeconds);
}

참고 : http://codeclimber.net.nz/archive/2007/07/10/Convert-a-Unix-timestamp-to-a-.NET-DateTime.aspx

Tag : .net, C#, datetime, unix timestamp

코멘트를 남겨 주세요. (Write your message and submit)
Random.Next(int minValue, int maxValue) 함수를 사용하면서,

직관적으로 당연히 minValue 와 maxValue를 포함하면서 그 사이의 정수가 나오는 줄 알고 써왔습니다.


그렇게 알고 살다가, 살다가... 오늘 어떤 프로그램에서 아래와 같은 코드를 구현한 후,

int nIndex = myRandom.Next(0, 4);

결과를 테스트 하는데, 죽어도 4가 안나오는 것입니다.

혹시나 해서 F1을 눌러 MDSN Library를 보니, 아래와 같이 기술되어 있었습니다.

매개 변수

minValue
형식: System..::.Int32

반환되는 난수의 하한(포함)입니다.

maxValue
형식: System..::.Int32

반환되는 난수의 상한(제외)입니다. maxValueminValue보다 크거나 같아야 합니다.


4를 보고 싶으면, 아래와 같이 해야하는 것입니다.

int nIndex = myRandom.Next(0, 5);

옛말이 틀리지 않았습니다.

"아는 메서드도 두들겨 보고 써라."

이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : C#, Random.Next메서드

코멘트를 남겨 주세요. (Write your message and submit)
안녕하세요!
엉뚱한 실험 제2탄입니다.

랜덤 값을 20개 정도 만들어써야 한다고 가정합시다.
간단히 2가지 방법이 있을 수 있습니다.

방법 1 :
Random rd = new Random();
for (int i = 0; i < 20; i++)
{
    double dValue = rd.NextDouble();
    ...
}

방법 2 :
for (int i = 0; i < 20; i++)
{
    Random rd = new Random();
    double dValue = rd.NextDouble();
    ...
}

어떤 결과가 예상되시나요?
2가지 방법이 어떻게 다른지 실험을 해보았습니다.

사용자 삽입 이미지



방법2에서는 같은 값만 만들어내는 것을 볼 수 있습니다.

Random 값을 생성하는 메커니즘이 시간(time)을 기반으로 하다보니,
빠른 속도로 생성하여 같은 시점에 생성된 Random인스턴스가
NextDouble 메서드를 통해 처음으로 내뱉는 값은 같은 값이 됩니다.

[방법2] for 루프 내부에 중단점(Break Point)을 걸어놓고 천천히 루프를 진행하면서
서로 다른 시간에 Random Instance가 생성될 수 있게 하면서 NextDouble의 리턴 값을
관찰해보면, 서로 다른 임의의 값을 얻을 수 있는 것을 확인할 수 있습니다.

대부분 방법1을 쓰지 누가 방법2를 쓰냐? 하시는 분 많으실 줄로 압니다.

하지만 예를 들어 우리가 만든 유저 컨트롤에서,
생성될 때마다 어떤 프로퍼티가 랜덤 값을 가지고 있길 바란다면,
생성자에서 Random 객체를 하나 생성하여 그 프로퍼티에 랜덤 값을 설정해 주는
코드를 넣게 될 가능성이 높습니다.

이후 어떤 코드에서 for 루프를 돌던지 하여 빠른 속도로,
그 객체 인스턴스를 100개 생성한다고 가정하면, [방법2] 같은 현상이 발생하게 되어,
그 객체가 가진 그 프로퍼티는 획일적인 값을 가지게 되는 일이 발생하게 됩니다.

그렇게 우리는 또 실수를 할 수 있습니다.
결론은 Random 인스턴스는 자기가 구성한 시스템 내에 전역적으로 한 개 정도만
만들어 놓고 공유해서 쓰는 것이 좋겠다는 것입니다.
이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : C#, NextDouble, Random, Silverlight, 실버라이트

  1. BlogIcon 길버트

    전역적으로 만들어 놓고 사용하는 것이 불편하다고 생각하시는 분은

    Local에서 선언할 때 static으로 하시면 됩니다.

    static Random rd = new Random(); 이렇게 말이죠. ^^

    | 2007/10/24 16:15 | PERMALINK | EDIT | REPLY |
코멘트를 남겨 주세요. (Write your message and submit)

아래 내용은 네이버 실버라이트 카페에 10월 7일 올렸던 글입니다.

원문 : http://cafe.naver.com/mssilverlight/816


가볍게 워밍업입니다.


뭐 이런 짓 왜해~ 하는 분들도 계실테지만, 눈으로 한번 확인해 보았습니다.

(실버라이트와 특별히 관계없는 실험입니다. C#의 기본적인 부분을 확인해 보았습니다.)


이벤트를 추가한 순서대로 수행되는 것이 정상적이겠지만,

또 변태적인 일이 일어날지 누가 알겠습니까? ^^



namespace Experiment
{
    public partial class Page : Canvas
    {
        public void Page_Loaded(object o, EventArgs e)
        {
            // Required to initialize variables
            InitializeComponent();


            // 같은 버튼에 각기 다른 3개의 이벤트 추가

            JustButton.MouseLeftButtonUp += new MouseEventHandler(JustButton_MouseLeftButtonUp1);
            JustButton.MouseLeftButtonUp += new MouseEventHandler(JustButton_MouseLeftButtonUp2);
            JustButton.MouseLeftButtonUp += new MouseEventHandler(JustButton_MouseLeftButtonUp3);


            JustOutput.Text = "";
            Title.Text = "Experiment #1 - The sequence of Events";
            AlignCenter(JustOutput);
        }

        void JustButton_MouseLeftButtonUp1(object sender, MouseEventArgs e)
        {
            JustOutput.Text+= "Event1 is called!\n";
            AlignCenter(JustOutput);
        }

        void JustButton_MouseLeftButtonUp2(object sender, MouseEventArgs e)
        {
            JustOutput.Text+= "Event2 is called!\n";
            AlignCenter(JustOutput);
        }

        void JustButton_MouseLeftButtonUp3(object sender, MouseEventArgs e)
        {
            JustOutput.Text += "Event3 is called!\n";
            AlignCenter(JustOutput);
        }

        void AlignCenter(TextBlock tb)
        {
            tb.SetValue(Canvas.LeftProperty, (Width - tb.ActualWidth) / 2);
            tb.SetValue(Canvas.TopProperty, (Height - tb.ActualHeight) / 2);
        }
    }
}



결과는 예상하시던대로 입니다.


사용자 삽입 이미지

추가한 순서대로 이벤트가 실행되는 것을 확인하였습니다. ^^;


그럼 다음 강좌에서 또 뵙겠습니다.

이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : C#, Event호출순서, Silverlight, 실버라이트, 엉뚱한실험실

코멘트를 남겨 주세요. (Write your message and submit)