您好,我正在尝试 运行 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 中默认情况下 CurrentCultureInvariantCulture,它使用 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(); - 它会挂起您的网络作业。