为什么我的DateTime.Now.Millisecond值总是" 000"?

时间:2014-10-08 19:12:06

标签: c# datetime milliseconds

我希望我的毫秒值总是长三个字符,所以我在必要时用“0”填充它:

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”的vals;返回的值如下:

Platypus_000003_20141008145606_000.xml

为什么会这样?

3 个答案:

答案 0 :(得分:3)

您的代码应该正常工作,除非您可能在Windows Compact Framework上运行。作为mentioned here,CF始终为DateTime.Millisecond返回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 :(得分: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。另外我确定 billNum 源的基本类型也是int,因此您不需要任何特殊方法,您已经有方法string.Format(),只需明智地使用它。您的所有代码都可以用一个语句替换:

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

答案 2 :(得分:0)

因为这确实是一个CF项目,正如Reed Copsey指出的那样,我注定要在那个环境中生长几毫秒(而且似乎也是秒),我(因为我真的不需要准确)秒/毫秒值,只是“某事”)这样做:

    . . .
    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”之类的值。