2014-10-08 5 views
2

내가 내 밀리 세컨드의 값은 항상 세 가지 자되고 싶어, 그래서 패딩 해요 그것을, 필요한 경우 "0"로 : 난 항상 세 가지로 발스을 얻고있다왜 DateTime.Now.Millisecond 값이 항상 "000"입니까?

private String getPlatypusFileName(String billNum) 
{ 
    const string basePortion = "Platypus_"; 
    String PlatypusFileName; 
    DateTime dt = DateTime.Now; 
    int Year = dt.Year; 
    int Month = dt.Month; 
    int Day = dt.Day; 
    int Hour = dt.Hour; 
    int Minute = dt.Minute; 
    int Second = dt.Second; 
    int Millisecond = dt.Millisecond; 
    String paddedBillNum = Prepad(6, billNum); 
    String mon = Prepad(2, Month.ToString()); 
    String day = Prepad(2, Day.ToString()); 
    String hour = Prepad(2, Hour.ToString()); 
    String min = Prepad(2, Minute.ToString()); 
    String sec = Prepad(2, Second.ToString()); 
    String milli = Prepad(3, Millisecond.ToString()); 
    PlatypusFileName = String.Format("{0}{1}_{2}{3}{4}{5}{6}{7}_{8}.xml", 
     basePortion, paddedBillNum, Year, mon, day, hour, min, sec, milli); 
    return PlatypusFileName; 
} 

private String Prepad(int finalSize, String originalVal) 
{ 
    String paddedVal = originalVal; 
    while (paddedVal.Length < finalSize) 
    { 
     paddedVal = "0" + paddedVal; 
    } 
    return paddedVal; 
} 

...하지만 " 밀리 초 부분은 0입니다. 반환 값은 다음과 같습니다.

Platypus_000003_20141008145606_000.xml 

왜 그럴까요?

+1

디버깅을 한 적이 있습니까? 밀리 세컨드 (Millisecond)는 0입니까, 아니면 Prepad가하는 것입니까? – Blorgbeard

+0

이것은 다양한 값 "2", "907", "362"등입니다. –

+2

이것은 실제로 저에게 잘 작동합니다 (밀리 초 부분은 정확하거나 적어도 0이 아닙니다). * 업데이트 * 다음은 작동하는 모습을 보여주는 피들입니다. https://dotnetfiddle.net/GyNClC –

답변

1

표준 datetime.toString ("special_format_string")을 사용하지 않는 이유는 무엇입니까? 문자열 클래스의 메서드를 익히고 형식에 대해서도 배웁니다. Prepad 방법도 필요하지 않습니다. 당신이 무엇을 모르는 경우

이상
private String getPlatypusFileName(String billNum) 
    { 
     const string basePortion = "Platypus_"; 
     String PlatypusFileName; 
     DateTime dt = DateTime.Now; 
     PlatypusFileName = String.Format("{0}{1}_{2}.xml", 
      basePortion, billNum.PadLeft(6,'0'), dt.ToString("yyyyMMddHHmmss_fff")); 
     return PlatypusFileName; 
    } 

보다가, const를 사용하지 않는 :

당신이 필요로하는 하나의 간단한 방법이다. 또한 기본 유형이 인 billNumint이므로 특별한 방법이 필요하지 않으므로 이미 string.Format() 메서드가있어 현명하게 사용하는 것이 좋습니다. 모든 코드는 하나 개의 문장으로 대체 할 수있다 :이 때문에

int billNum = 23; 
string PlatypusFileName = string.Format("Platypus_{0:D6}_{1:yyyyMMddHHmmss_fff}.xml", billNum, DateTime.Now); 
+1

-1이 대답의 도움을 얻었 기 때문에 –

+2

+1의 핵심 문제를 해결하지 못했습니다. – admdrew

+0

CF가 분명히 범인이기 때문에 임의로 코드를 파생시킵니다. 밀리 세컨드 (milliseconds) 부분을위한 차별화 된 값. BTW, billNum은 int가 아닌 String입니다. 보통 "03"과 비슷하지만 "Fumblebutt"(또는 다른 것) 일 수도 있습니다. –

3

Windows Compact Framework에서 실행되고 있다는 것을 제외하고는 코드가 잘 작동해야합니다. mentioned here으로, DateTime.Millisecond에 대해 항상 CF가 0을 반환하므로 Environment.TickCount과 같이 정확성이 필요한 경우 다른 접근 방식이 필요합니다.

말했다되고, 당신이 여기 Prepad를 사용할 필요가 없습니다 - 단지 적절하게 포맷 : 내 시스템에서

const string basePortion = "Platypus_"; 
DateTime dt = DateTime.Now; 
int billNum = 3; 

string result = string.Format("{0}{1:000000}_{2}{3:00}{4:00}{5:00}{6:00}{7:00}_{8:00}.xml", 
    basePortion, 
    billNum, 
    dt.Year, 
    dt.Month, 
    dt.Day, 
    dt.Hour, 
    dt.Minute, 
    dt.Second, 
    dt.Millisecond); 

를,이 값 출력합니다 : Platypus_000003_20141008121707_894.xml를 - 그게 실행 될 때마다 변경했지만, 당연하지.

+1

예,하지만 그가 "000"을 얻는 이유는 설명하지 않습니다. 동일한 코드가 내 컴퓨터에서 제대로 작동합니다. –

+1

OP의 'dt.Millisecond'값이 항상 0 인 경우 어떻게 도움이됩니까? – hvd

+0

@ThomasLevesque 내가 편집하고 또한 언급했다 - 다른 일이 없다는 것을 확신하지 못한다. ... –

0

은, 참으로, 리드 Copsey 지적으로 CF 프로젝트와는, 내가 밀리 초 동안 해당 환경에 zilches 운명있어 (그리고 초를 보인다 도), I (나는 정말 정확한 초를 필요로하지 않기 때문에 /, 그냥 "뭔가"를 값을 밀리 초)이 한 :

. . . 
    String pseudoSeconds = GetRandomIntAsStr(10,59); 
    String fauxMilliseconds = GetRandomIntAsStr(100, 999); 
    return String.Format("{0}-{1}-{2} {3}:{4}:{5}.{6}", year, month, day, hour, minute, pseudoSeconds, fauxMilliseconds); 
    . . . 

// ad[a,o]pted from http://www.whypad.com/posts/csharp-get-a-random-number-between-x-and-y/412/ 
internal static String GetRandomIntAsStr(int min, int max) 
{ 
    Random rnd = new Random(); 
    int val = rnd.Next(min, max); 
    return val.ToString(); 
} 

을 그리고 문자열의 무작위 부분에 대한 예 : "44.766"과 같은 값을 얻을 .