【问题标题】:DateTime.Now.ToString("M/d/yyyy HHmmss") returns month only in deployed locationDateTime.Now.ToString("M/d/yyyy HHmmss") 仅在部署位置返回月份
【发布时间】:2019-12-24 19:15:37
【问题描述】:

创建一个新文件夹

string newFolder = Globals.applicationPath + @"BatchHistory\Batch" + DateTime.Now.ToString("M/d/yyyy HHmmss") + @"\";

在开发 PC 中一切正常,文件夹命名为:“Batch12-23-2019 181504”

将控制台应用程序部署到服务器时,文件夹名称显示为“Batch12”

有什么线索吗?

侧面细节:

  • .net 框架 4.7.2
  • 输出类型:控制台应用
  • 本地开发环境:Win10
  • 部署的环境:WinSrv 2016

问题实际上是部署位置的文化设置。

【问题讨论】:

  • 文件夹名称不能包含某些字符,例如斜线变体。使用破折号获取Batch12-23-2019
  • / 是文件夹名称中的无效字符。使用"M-d-yyyy-HHmmss"。
  • 检查两台计算机控制面板中的区域设置并进行比较。
  • DateTime.Now.ToString("M/d/yyyy HHmmss") 是一个格式化程序,输出为 12-23-2019 181504,我在 tostring 方法中使用“-”进行了测试,但相同问题出现

标签: c# .net datetime formatting console-application


【解决方案1】:

您的DateTime.Now.ToString() 方法可能也会在您的部署位置创建“一些”格式,但正斜杠 (/)不能 Windows 中的文件夹名称。

发件人:Naming Files, Paths, and Namespaces

    The following reserved characters:
        < (less than)
        > (greater than)
        : (colon)
        " (double quote)
        / (forward slash)
        \ (backslash)
        | (vertical bar or pipe)
        ? (question mark)
        * (asterisk)

当您尝试命名文件夹时,它似乎在“第一个”/ 字符部分之前分配,在您的情况下为 Batch12。

请记住,the "/" custom format specifier 在自定义日期字符串上具有“替换我当前文化或提供的文化日期分隔符”的特殊含义。在您的开发 PC 中,您的 CurrentCulture 的 DateSeparator property 似乎 - 这就是它出现在结果字符串中的原因。

这意味着您部署的服务器的CurrentCulture 使用/ 作为DateSeparator,这就是为什么当您使用ToString 方法时它仍然导致/。

我建议您在开发和部署的服务器上使用相同的文化设置。或者您可以在代码中将日期分隔符从 / 更改为 -;

string newFolder = Globals.applicationPath + @"BatchHistory\Batch" +
                   DateTime.Now.ToString("M-d-yyyy HHmmss") + @"\";

【讨论】:

  • 我已经测试了将“/”替换为“-”但同样的问题,仅供参考
  • @Jean-FrançoisGélinas 请重新阅读我的完整答案。如果您使用 / 字符并且您当前或提供的区域性的日期分隔符不是 /,则该 / 字符将其自身替换为 that 字符。将 / 替换为 - 应该可以工作,因为它既不是保留字符,在自定义日期格式字符串中也没有特殊含义。
  • 嗨,谢谢文化设置是问题,只是为了澄清我在 toString 中使用“-”时仍然导致问题,尽管更改文化修复了它。
猜你喜欢
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多