【问题标题】:Replace date in string替换字符串中的日期
【发布时间】:2021-08-04 15:06:46
【问题描述】:

我将电子邮件主题存储在数据库中,例如“示例结果 {MM/dd/yyyy}”或“示例 {MM/dd/yyyy} 结果”。我需要获取字符串并将日期格式替换为当前日期。字符串中的日期格式可能会有所不同,例如它也可以是“{dd-MM-yyyy}”。 如果数据库中的数据类似于“示例结果 {0:MM/dd/yyyy}”,我可以使用以下代码:

string.Format(formattedSubject, DateTime.Now)

但是如何使它与“示例结果 {MM/dd/yyyy}”一起工作 我知道我可以使用:

string formattedSubject = subject.Replace("{","{0:");

但我认为这不是理想的解决方案。还有其他想法吗?

【问题讨论】:

  • 可能是subject.Replace("{MM/dd/yyyy}", DateTime.Now.ToString("MM/dd/yyyy"))?
  • 日期格式可以不同。这就是为什么我不能只使用替换。日期格式也可以是 MM-dd-yy
  • 如果您的格式很少,您可以链接替换。否则,正则表达式可以完成这项工作。
  • 它可以是任何日期格式,所以不知道在这种情况下如何使用正则表达式。
  • 我猜你需要重新考虑在同一个文件中使用“不同”的日期格式。您声明日期可能是“MM/dd/yyyy”或“dd-MM-yyyy”……。这对你来说是个问题。如果你得到像“06/04/2021”这样的日期……这是哪种格式? MM/dd/yyyy 还是 dd/MM/yyyy?混合日期格式从来都不是一个好主意。问题是,当您的代码误解日期时……您的代码将受到指责……一致的格式是保证您的代码解释正确日期的唯一方法。

标签: c#


【解决方案1】:

假设日期格式始终通过 DateTime.ToString 方法与 patterns accepted 兼容,您可以使用 regex 提取格式并进行替换:

string s = "Sample Result {MM/dd/yyyy}";
Regex r = new Regex(@"\{(.*?)\}");
string dateFormat = r.Match(s).Groups[1].Value; //Get the first matching group
string formatted = r.Replace(s,DateTime.Now.ToString(dateFormat));

显然您应该添加所有需要的空值检查和错误处理。

【讨论】:

  • 我比我更喜欢这个答案,因为它更简洁更好的正则表达式^_^
【解决方案2】:

由于格式的可变性,不是超级理想,但如果它始终在 {} 之间,它可以按以下方式工作

相关:

How to get a string between two characters?

How to replace the text between two characters in c#

// This is using the two above answers to grab the string between the {}
// and replace with a new date
string originalString = "Sample Result {MM/dd/yyyy}"
string s = originalString;

s = s.substring(s.indexOf("{") + 1);
s = s.substring(0, s.indexOf("}"));

s = DateTime.Now;

Regex regexGoodness = new Regex(@"\{([^\}]+)\}");
originalString = regexGoodness.Replace(originalString, s);

【讨论】:

    【解决方案3】:

    日期和时间总是有问题的,尤其是考虑到不同的文化和时区。

    当您在电子邮件标题中指定日期格式时,您是否可以将其更改为存储文化信息(请原谅混乱的代码)例如

        DateTime date = new DateTime(2021, 10, 31, 17, 4, 32);
        
        string emailHeader = "Sample Result {en-US}";
        
        string cultureString = emailHeader.Substring(emailHeader.IndexOf("{")+1,emailHeader.IndexOf("}")-emailHeader.IndexOf("{")-1);
        CultureInfo culture = new CultureInfo(cultureString);
        
        emailHeader = emailHeader.Replace(cultureString, date.ToString("d", culture));
        Console.WriteLine($"{culture} email header = \"{emailHeader}\"");
    
    
        emailHeader = "Sample Result {en-GB}";
        cultureString = emailHeader.Substring(emailHeader.IndexOf("{")+1,emailHeader.IndexOf("}")-emailHeader.IndexOf("{")-1);
        culture = new CultureInfo(cultureString);
    
        emailHeader = emailHeader.Replace(cultureString, date.ToString("d", culture));
        Console.WriteLine($"{culture} email header = \"{emailHeader}\"");
    
        
    

    给出输出:

    en-US email header = "Sample Result {10/31/2021}"
    en-GB email header = "Sample Result {31/10/2021}"
    

    【讨论】:

      猜你喜欢
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      相关资源
      最近更新 更多