我希望我的毫秒值总是长三个字符,所以我在必要时用“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
为什么会这样?
答案 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”之类的值。