您好,我正在尝试 运行 Azure 应用服务中的 Web 作业,但它抛出与日期时间相关的错误
Hi, I am trying to run a web job in Azure app service but it is throwing Error related to Datetime
我 运行在 Azure 应用服务中创建一个网络作业,它将获取当前日期时间并执行一些操作。但是当我在我的本地机器上 运行 它工作正常(我正在使用 .Net 控制台应用程序创建一个 webjob)。一旦我尝试 运行 它作为 Webjob 然后我得到这个错误。
Unhandled Exception: System.FormatException: String was not recognized as a valid DateTime.
System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)
System.Convert.ToDateTime(String value)
更多详情请查看下面的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Net;
using System.IO;
namespace Zoho_API_Services
{
class Items
{
#region DateTime
public DateTime datetime { get; set; }
public static DateTime Current_time { get; set; }
public static DateTime Target_time { get; set; }
//Constructor to get current date time
public Items()
{
datetime = DateTime.Parse(DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss"));
}
#endregion
public static void Main()
{
//Call the constructor
Items obj = new Items();
//Initialize Current time and Target time
Current_time = obj.datetime;
Target_time = Current_time.AddMinutes(55);
if (Current_time >= Target_time)
{
//Reset the Current time and Target time
Current_time = obj.datetime;
Target_time = Current_time.AddMinutes(55);
// Do something
}
else
{
// Do Something
}
Console.ReadKey();
}
}
}
调用构造函数时抛出错误。请帮忙
这行代码有几个问题:
datetime = DateTime.Parse(DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss"));
DateTime.Now
使用系统的本地时区。在云中,默认为 UTC。
- 由于您使用的是 Azure 网络作业,因此您可以设置
WEBSITE_TIME_ZONE
应用程序设置,但仅限于 Windows。如果您在 Linux 上 运行,这将不起作用。
- 更好的选择是使用
DateTime.UtcNow
,然后在必要时使用 TimeZoneInfo.ConvertTime
转换为特定时区。
在您的字符串格式中,您使用的是 hh
,它代表 12 小时制的 1-12 小时。因此,如果时间是 13:00 或更晚,您将在解析时损失 12 个小时。 HH
表示 24 小时制中的小时数。
在您的字符串格式中,您使用的是 dd/MM/yyyy
日期格式。这可能是您本地的格式,但在 Azure 中默认情况下 CurrentCulture
是 InvariantCulture
,它使用 MM/dd/yyyy
格式。您收到错误是因为您试图通过将 15 视为超出范围的月份来解析像 15/04/2021
这样的值。
永远不要曾经创建一个字符串只是为了在相同的代码中再次解析它。绝对没有理由这样做。如果你的目的是截断小数秒,你可以这样做:
datetime = datetime.AddTicks(-datetime.Ticks % TimeSpan.TicksPerSecond);
综合起来,您应该可能做以下事情:
// I chose the time zone based on the location in your Stack Overflow user profile.
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("India Standard time"); // or "Asia/Kolkata" on Linux
// Get the UTC time and convert to the given time zone.
datetime = TimeZoneInfo.ConvertTime(DateTime.UtcNow, tz);
// Truncate to seconds.
datetime = datetime.AddTicks(-datetime.Ticks % TimeSpan.TicksPerSecond);
以上将避免区域性设置的任何影响,因为没有进行解析或格式化。
此外,您应该删除 Console.ReadKey();
- 它会挂起您的网络作业。
我 运行在 Azure 应用服务中创建一个网络作业,它将获取当前日期时间并执行一些操作。但是当我在我的本地机器上 运行 它工作正常(我正在使用 .Net 控制台应用程序创建一个 webjob)。一旦我尝试 运行 它作为 Webjob 然后我得到这个错误。
Unhandled Exception: System.FormatException: String was not recognized as a valid DateTime.
System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)
System.Convert.ToDateTime(String value)
更多详情请查看下面的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Net;
using System.IO;
namespace Zoho_API_Services
{
class Items
{
#region DateTime
public DateTime datetime { get; set; }
public static DateTime Current_time { get; set; }
public static DateTime Target_time { get; set; }
//Constructor to get current date time
public Items()
{
datetime = DateTime.Parse(DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss"));
}
#endregion
public static void Main()
{
//Call the constructor
Items obj = new Items();
//Initialize Current time and Target time
Current_time = obj.datetime;
Target_time = Current_time.AddMinutes(55);
if (Current_time >= Target_time)
{
//Reset the Current time and Target time
Current_time = obj.datetime;
Target_time = Current_time.AddMinutes(55);
// Do something
}
else
{
// Do Something
}
Console.ReadKey();
}
}
}
调用构造函数时抛出错误。请帮忙
这行代码有几个问题:
datetime = DateTime.Parse(DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss"));
DateTime.Now
使用系统的本地时区。在云中,默认为 UTC。- 由于您使用的是 Azure 网络作业,因此您可以设置
WEBSITE_TIME_ZONE
应用程序设置,但仅限于 Windows。如果您在 Linux 上 运行,这将不起作用。 - 更好的选择是使用
DateTime.UtcNow
,然后在必要时使用TimeZoneInfo.ConvertTime
转换为特定时区。
- 由于您使用的是 Azure 网络作业,因此您可以设置
在您的字符串格式中,您使用的是
hh
,它代表 12 小时制的 1-12 小时。因此,如果时间是 13:00 或更晚,您将在解析时损失 12 个小时。HH
表示 24 小时制中的小时数。在您的字符串格式中,您使用的是
dd/MM/yyyy
日期格式。这可能是您本地的格式,但在 Azure 中默认情况下CurrentCulture
是InvariantCulture
,它使用MM/dd/yyyy
格式。您收到错误是因为您试图通过将 15 视为超出范围的月份来解析像15/04/2021
这样的值。永远不要曾经创建一个字符串只是为了在相同的代码中再次解析它。绝对没有理由这样做。如果你的目的是截断小数秒,你可以这样做:
datetime = datetime.AddTicks(-datetime.Ticks % TimeSpan.TicksPerSecond);
综合起来,您应该可能做以下事情:
// I chose the time zone based on the location in your Stack Overflow user profile.
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("India Standard time"); // or "Asia/Kolkata" on Linux
// Get the UTC time and convert to the given time zone.
datetime = TimeZoneInfo.ConvertTime(DateTime.UtcNow, tz);
// Truncate to seconds.
datetime = datetime.AddTicks(-datetime.Ticks % TimeSpan.TicksPerSecond);
以上将避免区域性设置的任何影响,因为没有进行解析或格式化。
此外,您应该删除 Console.ReadKey();
- 它会挂起您的网络作业。