从字符串中提取复杂的日期/时间格式
本文关键字:日期 时间 格式 复杂 字符串 提取 | 更新日期: 2023-09-27 18:20:23
我正试图找到最好的方法,从FTP文件列表中检索的文件名(字符串)中提取以非常奇怪的格式存储的日期和时间字符串。
字符串如下:
-rwxr-xr-x 1 ftp ftp 267662 Jun 06 09:13 VendorInventory_20130606_021303.txt'r
我试图提取的具体数据是20130606_021303
。021303
的格式为小时、秒和毫秒。DateTime.Passe和DateTime.ParseExact不愿意合作。你知道如何启动和运行吗?
看起来您已经获得了文件列表的整行,包括权限、用户、所有者、文件大小、时间戳和文件名。
您所要求的数据似乎只是文件名的一部分。首先使用一些基本的字符串操作(Split
、Substring
等)。然后,当您只有日期时间部分时,您可以调用DateTime.ParseExact
。
先自己试一试。如果遇到问题,请更新您的问题以显示您正在尝试的代码,有人会进一步帮助您。
哦,很好。见鬼。我感觉很慷慨。这里有一条线:
string s = // your string as in the question
DateTime dt = DateTime.ParseExact(string.Join(" ", s.Split('_', '.'), 1, 2),
"yyyyMMdd HHmmss", null);
但是,下次请先自己尝试一下。
UPDATE我假设FTP列表的文件显示有一个固定的结构,所以您可以简单地使用String.Substring
提取日期时间字符串,然后使用DateTime.ParseExact
:进行解析
var s = "-rwxr-xr-x 1 ftp ftp 267662 Jun 06 09:13 VendorInventory_20130606_021303.txt'r";
var datetime = DateTime.ParseExact(s.Substring(72,15),"yyyyMMddHHmmss",null);
原始答案
使用正则表达式。尝试以下操作:
var s = "-rwxr-xr-x 1 ftp ftp 267662 Jun 06 09:13 VendorInventory_20130606_021303.txt'r";
/*
The following pattern means:
'd{8}) 8 digits ('d), captured in a group (the parentheses) for later reference
_ an underscore
('d{6}) 6 digits in a group
'. a period. The backslash is needed because . has special meaning in regular expressions
.* any character (.), any number of times (*)
'r carriage return
$ the end of the string
*/
var pattern = @"('d{8})_('d{6})'..*'r$";
var match = Regex.Match(s, pattern);
string dateString = matches.Groups[1].Value;
string timeString = matches.Groups[2].Value;
并使用ParseExact
:进行解析
var datetime = DateTime.ParseExact(dateString + timeString,"yyyyMMddHHmmss",null);
这可能有效:
string s = "-rwxr-xr-x 1 ftp ftp 267662 Jun 06 09:13 VendorInventory_20130606_021303.txt'r";
// you might need to adjust the IndexOf method a bit - if the filename/string ever changes...
// or use a regex to check if there's a date in the given string
// however - the first thing to do is extract the dateTimeString:
string dateTimeString = s.Substring(s.IndexOf("_") + 1, 15);
// and now extract the DateTime (you could also use DateTime.TryParseExact)
// this should save you the trouble of substringing and parsing loads of ints manually :)
DateTime dt = DateTime.ParseExact(dateTimeString, "yyyyMMdd_hhmmss", null);