该字符串未被识别为有效的 DateTime 错误

The string was not recognized as a valid DateTime error

是的,我知道这个问题有很多话题,我搜索并看到了很多,但我仍然无法解决我的问题。

错误:字符串未被识别为有效的日期时间

我正在从不同形式的 datagridview 接收数据,我收到它并可以很好地显示它,但现在我想将字符串格式的数据转换为日期格式并将其显示在日期时间选择器上表格。

接收数据:

    public EditObras(string id, string NomeObra, string idCliente, string DataPLevantamento, string DataRLevantamento, string Estado, string DataRMateriais, string DataInicioObra, string DataConclusao, string DataVestoria, string Obs, string Prompor, string Levantpor, string executpor)
        {
            InitializeComponent();
            label4.Text = (string)id;
            textBox1.Text = (string)NomeObra;
            textBox2.Text = (string)idCliente;
            dateTimePicker1.Value = DateTime.ParseExact(DataPLevantamento, "d' de 'MMMM' de 'yyyy", System.Globalization.CultureInfo.CurrentCulture, System.Globalization.DateTimeStyles.None);
            // textBox3.Text = (string)DataPLevantamento;
            textBox4.Text = (string)DataRLevantamento;
            comboBox1.Text = (string)Estado;
            textBox5.Text = (string)DataRMateriais;
            textBox6.Text = (string)DataInicioObra;
            textBox7.Text = (string)DataConclusao;
            textBox8.Text = (string)DataVestoria;
            textBox12.Text = (string)Obs;
            textBox9.Text = (string)Prompor;
            textBox10.Text = (string)Levantpor;
            textBox11.Text = (string)executpor;
}

我在这一行收到错误:

dateTimePicker1.Value = DateTime.ParseExact(DataPLevantamento, "d' de 'MMMM' de 'yyyy", System.Globalization.CultureInfo.CurrentCulture, System.Globalization.DateTimeStyles.None);

"d' de 'MMMM' de 'yyyy"格式,我用的是这个格式,我是这样弄的格式,看看格式是什么:

string datePattern = System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat.LongDatePattern;
        textBox1.Text = datePattern;

DataPLevantamento 的值是这样的数据:

30 de outubro de 2016

异常堆栈:

System.FormatException was unhandled
  HResult=-2146233033
  Message=A cadeia de caracteres não foi reconhecida como valor DateTime válido.
  Source=mscorlib
  StackTrace:
       em System.DateTimeParse.ParseExact(String s, String format, DateTimeFormatInfo dtfi, DateTimeStyles style)
       em System.DateTime.ParseExact(String s, String format, IFormatProvider provider, DateTimeStyles style)
       em GestãodeobrasGasFenosa.EditObras..ctor(String id, String NomeObra, String idCliente, String DataPLevantamento, String DataRLevantamento, String Estado, String DataRMateriais, String DataInicioObra, String DataConclusao, String DataVestoria, String Obs, String Prompor, String Levantpor, String executpor) em C:\Users\BugDroid\Documents\Visual Studio 2015\Projects\GestãodeobrasGasFenosa\GestãodeobrasGasFenosa\EditObras.cs:line 26
       em GestãodeobrasGasFenosa.Form1.dataGridView1_CellDoubleClick(Object sender, DataGridViewCellEventArgs e) em C:\Users\BugDroid\Documents\Visual Studio 2015\Projects\GestãodeobrasGasFenosa\GestãodeobrasGasFenosa\Form1.cs:line 606
       em System.Windows.Forms.DataGridView.OnCellDoubleClick(DataGridViewCellEventArgs e)
       em System.Windows.Forms.DataGridView.OnDoubleClick(EventArgs e)
       em System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       em System.Windows.Forms.Control.WndProc(Message& m)
       em System.Windows.Forms.DataGridView.WndProc(Message& m)
       em System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       em System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       em System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       em System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       em System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
       em System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       em System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       em System.Windows.Forms.Application.Run(Form mainForm)
       em GestãodeobrasGasFenosa.Program.Main() em C:\Users\BugDroid\Documents\Visual Studio 2015\Projects\GestãodeobrasGasFenosa\GestãodeobrasGasFenosa\Program.cs:line 19
       em System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       em System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       em Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       em System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       em System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       em System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       em System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       em System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

使用自定义区域性尝试这种方式

CultureInfo culture = new CultureInfo("pt-PT"); 
dateTimePicker1.Value = DateTime.ParseExact(DataPLevantamento, "d' de 'MMMM' de 'yyyy", 
                        culture, System.Globalization.DateTimeStyles.None);

这是由于实际 CultureInfo CultureInfo 需要等于你的, 所以你必须创建一个新的 CultureInfo 变量。

我猜这门语言是葡萄牙语。

string DataPLevantamento = "30 de outubro de 2016";
    var provider = new System.Globalization.CultureInfo("pt-PT"); 
    string result = DateTime.ParseExact(DataPLevantamento,
                        "d' de 'MMMM' de 'yyyy",
                        provider,
                        System.Globalization.DateTimeStyles.None).ToString();
    Console.WriteLine(result);