Что не так с этой строкой даты? Вызывая: «Необработанное исключение: System.FormatException» - PullRequest
0 голосов
/ 11 февраля 2011

Я называю свой сценарий так:

>Driver.exe 26268 "01-01-2011" "02-01-2011"

arg 0 : c:\Services\JasperBatchService\Release\JasperBatchDriver.exe
arg 1 : 26268

Unhandled Exception: System.FormatException: String was not recognized as a valid DateTime.
   at System.DateTimeParse.ParseExact(String s, String format, DateTimeFormatInfo dtfi,  DateTimeStyles style)
   at Program.main(String[] args) in C:\sswork\dev\fSharpServices\ops-Projects\JasperBatchDriver\Program.fs:line 65

и это соответствующий код:

let mutable argNum = 0
let cmdArgs = System.Environment.GetCommandLineArgs()    

for arg in cmdArgs do
    match argNum with
    | 1 -> pmID      <- System.Int32.Parse arg 
    | 2 -> startDate <- DateTime.ParseExact(arg, "D", new CultureInfo("en-US"))
    | 3 -> endDate   <- DateTime.ParseExact(arg, "D", new CultureInfo("en-US"))
    | _ -> ()
    printfn "arg %d : %s" argNum arg
    argNum <- argNum + 1

Я тоже пробовал это:

for arg in cmdArgs do
    match argNum with
    | 1 -> pmID      <- System.Int32.Parse arg 
    | 2 -> startDate <- DateTime.ParseExact(arg, "MM-dd-yyyy", new CultureInfo("en-US"))
    | 3 -> endDate   <- DateTime.ParseExact(arg, "MM-dd-yyyy", new CultureInfo("en-US"))
    | _ -> ()
    printfn "arg %d : %s" argNum arg
    argNum <- argNum + 1

и это:

for arg in cmdArgs do
    match argNum with
    | 1 -> pmID      <- System.Int32.Parse arg 
    | 2 -> startDate <- DateTime.ParseExact(arg, "MM/dd/yyyy", new CultureInfo("en-US"))
    | 3 -> endDate   <- DateTime.ParseExact(arg, "MM/dd/yyyy", new CultureInfo("en-US"))
    | _ -> ()
    printfn "arg %d : %s" argNum arg
    argNum <- argNum + 1

самое близкое, что я получил, это использование:

(startDate).ToString("MM/dd/yyyy")

это однако добавило двойные кавычки к выводу ....

Ответы [ 3 ]

4 голосов
/ 11 февраля 2011

Похоже, что ваши вызовы DateTime.ParseExact ожидают формат "D" (шаблон длинной даты), который отличается от того, что вы предоставляете. Если вы планируете принимать аргументы в формате ММ-ДД-ГГГГ, вам нужно будет использовать пользовательский формат.

Попробуйте это:

DateTime.ParseExact(arg, "MM-dd-yyyy", new CultureInfo("en-US"))
1 голос
/ 11 февраля 2011

это работает (из fsi):

System.DateTime.ParseExact ("01-01-2011", "MM-dd-yyyy",
System.Globalization.CultureInfo "en-US");;
val it : System.DateTime = 1/1/2011 12:00:00 AM {Date = 1/1/2011 12:00:00 AM;
                                             Day = 1;
                                             DayOfWeek = Saturday;
                                             DayOfYear = 1;
                                             Hour = 0;
                                             Kind = Unspecified;
                                             Millisecond = 0;
                                             Minute = 0;
                                             Month = 1;
                                             Second = 0;
                                             Ticks = 634294368000000000L;
                                             TimeOfDay = 00:00:00;
                                             Year = 2011;}

как вы перебираете массив args?не всегда ли изменяемый аргумент argNum равен 0?

0 голосов
/ 11 февраля 2011

arg 2 должно быть в этом формате 01-01-2011

...