我在InstantServiceStack 的 DTO 中使用 NodaTime进行日期/时间存储。我已将 DTO 中的 SQL 类型指定为datetimeoffset,ServiceStack 正确创建了具有该类型的表。但是,在保存时,我得到一个InvalidCastException.
简单的例子:
public class ItemWithInstant
{
public int Id { get; set; }
public string Name { get; set; }
[CustomField("DateTimeOffset")
public Instant DateCreated { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在服务中:
public object Post(CreateItemWithInstant request)
{
var dto = request.ConvertTo<ItemWithInstant>();
Db.Save(dto); // ERROR here
return dto;
}
Run Code Online (Sandbox Code Playgroud)
具体的错误是一个InvalidCastException带有Failed to convert parameter value from an Instant to a String 的详细信息。
不知道为什么当数据库类型为DateTimeOffset. 我是否需要告诉 …
我想通过提供国家/地区代码,使用 NodaTime 将特定日期时间值转换为 UTC。
例如,国家是土耳其,国家代码是 TR,具体日期时间是“2016 年 2 月 5 日 7:45 PM”,那么可能是“2016 年 2 月 5 日 5:45 PM”吗?
另外我的窗户位置不是土耳其。
先感谢您?
我想将活动(未弃用)时区 ID 列表返回给用户。使用TzdbDateTimeZoneSource.Default.ZoneLocations.ToList()我可以列出所有时区,但我没有找到如何过滤掉不推荐使用的区域。在最坏的情况下,我可以基于https://en.wikipedia.org/wiki/List_of_tz_database_time_zones建立我自己的列表,但会更高兴从 NodaTime 生成列表。
我正在使用 C# 程序处理日期。
我想过滤任何具有 DateTime、DateTime2、DateTimeOffset 列的表。
我将LastRefreshDateas存储DateTimeOffSet为 UTC,并使用它来过滤这些表上的数据。我调整偏移量(使用NodaTime)LastRefreshDate我根据用于在这些表中存储日期的时区通常,它是由用户给出的。
所以我创建了一个测试样本来解释这个问题。通常,SQL 查询是动态的,参数也是动态的。这是示例代码:
[TestMethod]
public void Test()
{
using (SqlConnection connection = new SqlConnection("Server=myserver;Database=mydb;User ID=admin;Password=admin"))
{
connection.Open();
using (SqlCommand command = new SqlCommand("SELECT [TimeStamp] FROM [dbo].[DATA] WHERE [TimeStamp] >= @p0", connection))
{
string datestring = "2019-06-18 13:35:20.1133868 -04:00";
// Does not work
// DateTimeOffset p0 = DateTimeOffset.Parse(datestring, CultureInfo.InvariantCulture);
// Does work
DateTime p0 = DateTime.Parse(datestring, CultureInfo.InvariantCulture);
command.Parameters.AddWithValue("@p0", p0);
using (SqlDataReader reader = command.ExecuteReader())
{
var dataTable = …Run Code Online (Sandbox Code Playgroud) 我有一个在输入和输出中都使用Noda Time类型的 API 。使用默认的 Noda Time 序列化格式(基本上是 ISO-8601 格式)将类型序列化为 JSON 中的字符串。
我有一个看起来像这样的对象:
public class NodaTimeDataStructure
{
public System.DateTime DateTime { get; set; }
public DateInterval DateInterval { get; set; }
public DateTimeZone DateTimeZone { get; set; }
public Duration Duration { get; set; }
public Instant Instant { get; set; }
public Interval Interval { get; set; }
public IsoDayOfWeek IsoDayOfWeek { get; set; }
public LocalDate LocalDate { get; set; }
public LocalDateTime LocalDateTime { get; set; …Run Code Online (Sandbox Code Playgroud) 如何从 NodaTime 获取“时区”列表,以便我可以制作如下所示的 UI 供用户选择?
我想显示 UTC 偏移量,然后显示相应的城市/国家/地点。它不需要与下面的完全一样,但你知道,很接近。
DateTimeZone没有 name 属性,并且ing 会产生重复项(来自fromToString()的列表)。IdsIDateTimeZoneProvider
我看到你可以从〜国家到地区,但这TzdbDateTimeZoneSource.Default.ZoneLocations也不是我正在寻找的。我可以看到如何将这两个数据源拼凑在一起,但这感觉像是一个已解决的问题,我不应该重新发明。
我目前正在使用NodaTime来解析日期和输出日期
public static string nodaTimeTest6(string input)
{
var defaultValue = new OffsetDateTime(new LocalDateTime(2000, 1, 1, 0, 0), Offset.Zero);
var pattern = OffsetDateTimePattern.Create("yyyy-MM-dd'T'HH:mm:sso<m>", CultureInfo.InvariantCulture, defaultValue);
var result = pattern.Parse(input);
return result.Value.Month + "/" + result.Value.Day + "/" + result.Value.Year + " " + result.Value.ClockHourOfHalfDay;
}
Run Code Online (Sandbox Code Playgroud)
例如,输入是这样的: 2014-03-11T02:00:00-07:00
如果我的return声明如下:return result.Value.ToString(),那么输出将如下所示:2014-03-11T02:00:00-07
我理解使用NodaTime属性(这是一个救生员),但是,我对这样的输出感兴趣:
yyyy-MM-dd HH:mm:ss
yyyyMMdd HH:mm:ss
dd/MM/yyyy hh:mm
所以我试着将我的return陈述改为:
return result.Value.Month + "/" + result.Value.Day + "/" + result.Value.Year + " " + result.Value.Hour + ":" …
我非常依赖Resharper上下文操作来生成样板代码.直到最近,空上下文操作的Check参数生成了执行空检查并相应抛出的代码.但是,现在它正在将[NotNull]参数的Resharper特定注释添加为方法签名的一部分.
看看这个相关问题Stop ReSharper来自添加注释,我已经在我的解决方案代码库中查看了jetbrains.annotations.dll参考资料,但没有找到任何参考资料.
但是,搜索所有文件我在NodTime(NodaTime.xml)jetbrains.annotations.dll的xml文档文件中找到了引用.
具体来说,这样的条目:
<member name="T:JetBrains.Annotations.NotNullAttribute">.
我并非断然断言这是根本原因.但是,NodaTime是我自问题开始以来添加的最新nuget包,并且解决方案中的grep显示这是单一参考点.
xml文档文件是否应该包含这些引用,如果是这样,有没有办法让我配置Resharper来忽略它们?
更新 我已经反编译了NodaTime程序集,虽然它没有对jetbrains.annotations.dll的任何二进制引用,但它确实(重新)声明了违规的JetBrains.Annotations命名空间和注释本身.
根据citizenmatts的建议,我用Resharper 带我去定义[NotNull]属性的工具,这就是NodaTime.dll
我还注意到NotNullResharper所包含的属性不会编译和抱怨Cannot reference internal class NotNullAttribute.因此,我显然没有包含jetbrains.annotations.dll.
更新2
刚刚完成了在VS2013中创建一个新的空白项目并检查Resharper中的空检查上下文操作的明显事情.然后添加NodaTime nuget包并重新检查 - 实际上它添加了[NotNull]属性,项目不会编译.
更新3 正如Jon Skeet所建议的那样,我尝试使用Resharper - > Code Inspection - > Code Annotations - > Unticking JetBrains.Annotations"关闭"数据注释.但是,这没有任何影响,并且继续包含NotNull属性.
看起来我可能只需要返回System.DateTime.
我们正在项目中使用NodaTime作为时间/日期模型.该项目是一个使用WebAPI的Web应用程序.尝试发布包含LocalTime autoprops的模型时,我们会收到InsufficientExecutionStackException.
为了将我们的项目与此问题隔离开来,我创建了一个新的WebAPI项目.使用NuGet,我将NodaTime和NodaTime.Serialization.JsonNet添加到项目中.在Startup.cs,我ConfigureForNodaTime这样使用:
GlobalConfiguration.Configure(x =>
{
x.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
x.Formatters.JsonFormatter.SerializerSettings.ConfigureForNodaTime(
DateTimeZoneProviders.Tzdb);
});
Run Code Online (Sandbox Code Playgroud)
在(样板ValuesController.cs文件)文件中,我这样被劫持Post:
// POST api/values
public void Post(TestClass input)
{
var x = input;
}
public class TestClass
{
public LocalTime Open { get; set; }
public LocalTime Close { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当发布此输入模型(通过邮递员),而不是接收本地时间时,我在本文末尾收到错误.
如果我们TestClass如图所示重写,则不会发生错误,并且我们得到正确的本地时间:
public class TestClass
{
public LocalTime;
public LocalTime;
}
Run Code Online (Sandbox Code Playgroud)
我能做些什么来让应用程序与autoprops一起工作吗?虽然我可以(也可能会)开始用字段替换autoprops,但了解这里发生的事情会很好.
这是整个错误,从中间删除了800个任意行:
{
"message":"An error has occurred.",
"exceptionMessage":"Insufficient stack to continue executing the program safely. This …Run Code Online (Sandbox Code Playgroud) 我需要使用NodaTime计算两个日期之间的天数,并在时区中进行计算.
结束时间是基于当天结束时暗示的午夜时间.这个日期是在时区.
开始时间是当前时间,但我将它传递给函数,以便该函数是可测试的.
我尝试使用Period,这似乎是明显的答案,但是Period在一端太过细化(当我们在结束日时)并且当我们超过1个月之后不够精细.
因此,如果现在是美国/多伦多的7月9日,下午5:45,结束时间是9月1日00:00:00,那么我希望能够计算54天.(假设我正确计算了我日历上的天数.:))
我想我自己必须处理子日问题,但当我不得不弄清楚如何处理一个多月的问题时,我感到很惊讶.
是否有明显的方法可以从NodaTime获得两次之间的天数?我使用.Net的DateTime和TimezoneInfo类将它归结为三行代码,但我想转移到NodaTime,原因是网站上指定的所有原因.
谢谢
nodatime ×10
c# ×8
timezone ×3
sql-server ×2
.net ×1
datetime ×1
localization ×1
nswag ×1
nuget ×1
resharper ×1
servicestack ×1
swagger ×1