using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Reflection;
using System.IO;
using NodaTime;
namespace MyApp
{
public partial class MainForm : Form
{
public class Foo
{
private LocalDateTime date_time;
public Foo(string data)
{
Int32 i;
char[] delimiters = { ',', '/', ':' };
string[] tokens = data.Split(delimiters);
if( Int32.TryParse(tokens[0], out i ))
{
date_time.Month = i;
}
}
};
public MainForm()
{
InitializeComponent();
}
}
}
我将date_time.Month设置为i的行是我在标题中调用错误的地方 - 无法将属性或索引器分配给它 - 它是只读的。我搜索了很多类似的帖子,但无法找到解决方案。任何帮助将不胜感激。提前谢谢!
答案 0 :(得分:1)
如果LocalDateTime
是可变的,您可以这样做:
LocalDateTime x = new LocalDateTime();
x.Year = 2016;
x.Month = 4;
x.Day = 20;
x.Hour = 11;
x.Minute = 30;
但是,它并不可变。它是不可变的。因此,您必须这样做:
LocalDateTime x = new LocalDateTime(2016, 4, 20, 11, 30);
在您的代码中,您已在类中定义了一个字段date_time
,并将其声明为LocalDateTime
类型,但您从未为其分配过值。由于此类型为struct
,因此将使用其默认值对其进行初始化,LocalDateTime
为1970-01-01 00:00:00
。
然后尝试设置一个属性,好像该值是可变的,但它是不可变的,因此没有setter。相反,您需要为字段分配LocalDateTime
结构的新实例,与上面的显示类似。
同时认识到Noda Time内置了广泛的解析功能,因此无需将字符串拆分为组件或尝试将其解析为整数。例如:
using NodaTime;
using NodaTime.Text;
...
var pattern = LocalDateTimePattern.CreateWithInvariantCulture("M/d/yyyy HH:mm:ss");
var result = pattern.Parse("4/20/2016 11:30:00");
if (!result.Success)
{
// handle error
}
LocalDateTime ldt = result.Value;
如果您要解析大量值,可以在静态变量中保留pattern
实例,以避免每次都创建它。这提供了比DateTime.ParseExact
等等BCL方法更好的性能。