Eric:
Please try the following:
Clear[osplit, opm, dlist];
dlist = Table[
Block[{$DateStringFormat = {"Month", "/", "Day", "/", "Year", " ",
"Hour12", ":", "Minute", ":", "Second", " ", "AMPM"}},
DatePlus[DateString[], RandomReal[{-1000, 0}]]], {10000}];
osplit[x_] := Module[{}, StringSplit[x, {"/", " ", ":"}] ];
opm[y_] := Module[{},
ToExpression[
If[Last[y] == "PM",
Permute[Most[ReplacePart[y, 4 -> ToExpression[y[[4]]] + 12]],
Cycles[{{3, 1, 2}}]], Permute[Most[y], Cycles[{{3, 1, 2}}]]]]];
Basically generating 10,000 samples that match your format with "AM" and "PM". Then subsequent function that operate on that string format whose aim is to get the list into WL DateList-like format {yyyy, mm, dd, hh, mm, ss} .
DateObject /@
Map[opm[#] &, Map[osplit[#] &, dlist]] // AbsoluteTiming
(* {0.854198,{Fri 7 Dec 2018 09:40:06GMT-5., ...*)
Functions can be improved and combined to get even more efficiencies. Will Block
or With
be faster than Module
Please note the AM, PM logic is simplified to just add 12 if PM but it is a bit more complicated than that. But tweaking that should not add too much more time