- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
天然气日定义为 24 小时的时间范围,从世界标准时间 5:00 开始,到欧洲标准时间次日世界标准时间 5:00 结束。在欧洲夏令时期间,它从 4:00 UTC 开始到次日 4:00 UTC 结束(请参阅 Wikipedia 或 ACER 了解英文说明)。
我需要在应用程序中使用 gas days 以执行以下操作:
这对我来说感觉好像“gas day”应该作为类似于时区的东西可用,然后我可以在我的应用程序中使用它,但尝试使用 DateTime
或 DateTimeOffset
让我完全不知道我应该做什么来完成这项工作。
任何人都可以指出我必须做些什么才能让我进行上面解释的计算的正确方向吗?是否有一个图书馆可以使这更容易做到?例如,我已经研究过 NodaTime ,但我在它的文档中找不到任何能让我更轻松地解决此任务的内容。
最佳答案
我将使用稍微更精确的定义:“Gas Days”(或更确切地说是“Gas Time”,因为这里有时间部分)基于德国本地时区,但偏移了 6 小时,因此德国的 06:00在 Gas Time 中是 00:00。
正如您在自己的实验中发现的那样,自定义时区方法并不那么容易实现,因为所有转换都是根据德国本地的日期和时间发生的,即使气体转移将值插入不同的日期。 (使用 NodaTime 可能可行,但使用 TimeZoneInfo
则不行。)
考虑到这一点,您需要在德国时间进行所有转换和操作,然后将它们转移到 Gas Time。一些扩展方法在这里很有用。解释性注释内联代码。
public static class GasTimeExtensions
{
private static readonly TimeZoneInfo GermanyTimeZone =
TimeZoneInfo.FindSystemTimeZoneById("Europe/Berlin");
// (use "W. Europe Standard Time" for .NET < 6 on Windows)
private static readonly TimeSpan GasTimeOffset = TimeSpan.FromHours(6);
/// <summary>
/// Adjusts the provided <paramref name="dateTimeOffset"/> to Gas Time.
/// </summary>
/// <param name="dateTimeOffset">The value to adjust.</param>
/// <returns>The adjusted value.</returns>
public static DateTimeOffset AsGasTime(this DateTimeOffset dateTimeOffset)
{
// Convert to Germany's local time.
var germanyTime = TimeZoneInfo.ConvertTime(dateTimeOffset, GermanyTimeZone);
// Shift for Gas Time.
return germanyTime.ToOffset(germanyTime.Offset - GasTimeOffset);
}
/// <summary>
/// Adjusts the provided <paramref name="dateTime"/> to Gas Time.
/// </summary>
/// <param name="dateTime">The value to adjust.</param>
/// <returns>The adjusted value.</returns>
public static DateTime AsGasTime(this DateTime dateTime)
{
// Always go through a DateTimeOffset to ensure conversions and adjustments are applied.
return dateTime.ToGasDateTimeOffset().DateTime;
}
/// <summary>
/// Adjusts the provided <paramref name="dateTime"/> to Gas Time,
/// and returns the result as a <see cref="DateTimeOffset"/>.
/// </summary>
/// <param name="dateTime">The value to adjust.</param>
/// <returns>The adjusted value as a <see cref="DateTimeOffset"/>.</returns>
public static DateTimeOffset ToGasDateTimeOffset(this DateTime dateTime)
{
if (dateTime.Kind != DateTimeKind.Unspecified)
{
// UTC and Local kinds will get their correct offset in the DTO constructor.
return new DateTimeOffset(dateTime).AsGasTime();
}
// Treat the incoming value as already in gas time - we just need the offset applied.
// However, we also need to account for values that might be during DST transitions.
var germanyDateTime = dateTime + GasTimeOffset;
if (GermanyTimeZone.IsInvalidTime(germanyDateTime))
{
// In the DST spring-forward gap, advance the clock forward.
// This should only happen if the data was bad to begin with.
germanyDateTime = germanyDateTime.AddHours(1);
}
// In the DST fall-back overlap, choose the offset of the *first* occurence,
// which is the same as the offset before the transition.
// Otherwise, we're not in a transition, just get the offset.
var germanyOffset = GermanyTimeZone.GetUtcOffset(
GermanyTimeZone.IsAmbiguousTime(germanyDateTime)
? germanyDateTime.AddHours(-1)
: germanyDateTime);
// Construct the Germany DTO, shift to gas time, and return.
var germanyDateTimeOffset = new DateTimeOffset(germanyDateTime, germanyOffset);
return germanyDateTimeOffset.ToOffset(germanyOffset - GasTimeOffset);
}
/// <summary>
/// Add a number of calendar days to the provided <paramref name="dateTimeOffset"/>, with respect to Gas Time.
/// </summary>
/// <remarks>
/// A day in Gas Time is not necessarily 24 hours, because some days may contain a German DST transition.
/// </remarks>
/// <param name="dateTimeOffset">The value to add to.</param>
/// <param name="daysToAdd">The number of calendar days to add.</param>
/// <returns>The result of the operation, as a <see cref="DateTimeOffset"/> in Gas Time.</returns>
public static DateTimeOffset AddGasDays(this DateTimeOffset dateTimeOffset, int daysToAdd)
{
// Add calendar days (with respect to gas time) - not necessarily 24 hours.
return dateTimeOffset.AsGasTime().DateTime.AddDays(daysToAdd).ToGasDateTimeOffset();
}
/// <summary>
/// Add a number of calendar days to the provided <paramref name="dateTime"/>, with respect to Gas Time.
/// </summary>
/// <remarks>
/// A day in Gas Time is not necessarily 24 hours, because some days may contain a German DST transition.
/// </remarks>
/// <param name="dateTime">The value to add to.</param>
/// <param name="daysToAdd">The number of calendar days to add.</param>
/// <returns>The result of the operation, as a <see cref="DateTime"/> in Gas Time.</returns>
public static DateTime AddGasDays(this DateTime dateTime, int daysToAdd)
{
// Add calendar days (with respect to gas time) - not necessarily 24 hours.
return dateTime.AsGasTime().AddDays(daysToAdd).AsGasTime();
}
}
一些用法示例:
转换特定的时间戳
var test = DateTimeOffset.Parse("2022-03-22T05:00:00Z").AsGasTime();
Console.WriteLine($"{test:yyyy-MM-ddTHH:mm:sszzz} in Gas Time is
{test.UtcDateTime:yyyy-MM-ddTHH:mm:ssZ} UTC.");
输出:
2022-03-22T00:00:00-05:00 in Gas Time is 2022-03-22T05:00:00Z UTC.
获取当前gas时间戳
var now = DateTimeOffset.UtcNow.AsGasTime();
Console.WriteLine($"It is now {now:yyyy-MM-ddTHH:mm:sszzz} in Gas Time ({now.UtcDateTime:yyyy-MM-ddTHH:mm:ssZ} UTC).");
输出:
It is now 2022-05-10T14:31:56-04:00 in Gas Time (2022-05-10T18:31:56Z UTC).
添加绝对时间(小时、分钟、秒等)
var start = DateTimeOffset.Parse("2022-03-26T05:00:00Z").AsGasTime();
var end = start.AddHours(24 * 7).AsGasTime(); // add and correct any offset change
Console.WriteLine($"Starting at {start:yyyy-MM-ddTHH:mm:sszzz} Gas Time ({start.UtcDateTime:yyyy-MM-ddTHH:mm:ssZ} UTC),");
Console.WriteLine($"7 x 24hr intervals later is {end:yyyy-MM-ddTHH:mm:sszzz} Gas Time ({end.UtcDateTime:yyyy-MM-ddTHH:mm:ssZ} UTC).");
输出:
Starting at 2022-03-26T00:00:00-05:00 Gas Time (2022-03-26T05:00:00Z UTC),
7 x 24hr intervals later is 2022-04-02T01:00:00-04:00 Gas Time (2022-04-02T05:00:00Z UTC).
添加或减去日历天数(由于 DST 转换,严格来说不是 24 小时天数)
var start = DateTimeOffset.Parse("2022-03-26T05:00:00Z").AsGasTime();
var end = start.AddGasDays(7); // add and correct any offset change
Console.WriteLine($"Starting at {start:yyyy-MM-ddTHH:mm:sszzz} Gas Time ({start.UtcDateTime:yyyy-MM-ddTHH:mm:ssZ} UTC),");
Console.WriteLine($"7 calendar days later is {end:yyyy-MM-ddTHH:mm:sszzz} Gas Time ({end.UtcDateTime:yyyy-MM-ddTHH:mm:ssZ} UTC).");
输出:
Starting at 2022-03-26T00:00:00-05:00 Gas Time (2022-03-26T05:00:00Z UTC),
7 calendar days later is 2022-04-02T00:00:00-04:00 Gas Time (2022-04-02T04:00:00Z UTC).
请注意,在最后两个示例中,我选择了与您不同的日期,以演示跨 DST 转换。
关于c# - 如何在 C# 项目中使用 gas days?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72113804/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!