[C#] 문자열에서 yyyyMMdd(20201016 등)와 timezone(+0900 등)을 검색하여 DateTime으로 변환
→ h tps:// 퀵했다. 작은 m / 절 1707 / MS / 4f입니다 73D86 그림 d283 그림 C4f
하고 싶은 일
파일명에 날짜가 들어 있는 로그 파일이 있어, 그것이 있는 폴더에 정리해 넣어지고 있다.
그러한 로그 파일들 중에서, 파일의 갱신 일자가 아니라 「파일명에 붙어 있는 일자」가 제일 새로운 것의 일자를 꺼내고 싶다는 것이 있었다.
※아래 그림과 같은 파일이 있는 경우는, 「testlog_21201017+0900.log」의 일자가 제일 새롭기 때문에, DateTime의 「2120/10/17」를 꺼내고 싶다.
이번의 경우는, 파일명에 yyyyMMdd
뿐만이 아니라 타임 존을 나타내는 +0900
라고 하는 것이 들어간 형식이었다.
조사한 결과, 일자의 문자열(20201016등)을 일단 DateTime에 고쳐, 그 값으로 어느 것이 새로운지를 판단하기로 했지만, 특히 타임 존의 곳을 DateTime에 고칠 때에 조금 버릇이 있었으므로 메모를 남겨 둡니다.
했던 일
다음과 같은 일을 했다.
다음과 같은 일을 했다.
Directory.GetFiles()
에 확장자를 지정하여 폴더의 모든 로그 파일을 열거 DateTime.ParseExact()
로 DateTime으로 변환 구체적인 흐름은 아래의 샘플 코드를 참조하지만,
3번의
DateTime.ParseExact()
를 하는 곳에 조금 버릇이 있었다.DateTime.ParseExact() 버릇
DateTime.ParseExact()
는, 서식을 지정해, 캐릭터 라인으로부터 DateTime 로 변환하는 것이지만,
위 그림과 같은 파일명에 포함된 20201016+0900
를 DateTime으로 변환할 때, 그대로의 문자열과 서식 지정의 yyyyMMddzzz
대책은DateTime.ParseExact()
를 20201016+0900
로 고치고 20201016 +09:00
에 건네준다는 것.
// こういうイメージ
DateTime.ParseExact("20201016+0900", "yyyyMMdd zzz", null)
이제 시간대도 포함하고 DateTime으로 변환할 수 있었다.
DateTime.ParseExact ()의 버릇은 그리 많지 않았습니다 (20/10/31 추가)
@htsign 님으로부터 코멘트 받았습니다.
// こうではなく
DateTime.ParseExact("20201016+0900", "yyyyMMdd zzz", null)
// こうだとInsertとかしなくてもうまくいく様子
DateTime.ParseExact("20201016+0900", "yyyyMMddzzz", null) // ←「zzz」の前のスペースが余計だった
상기라면 특히 특별한 일을 하지 않아도 OK라는 것이 판명. 감사합니다.
이 기사의 간이라고 생각했던 부분이 무너지는 느낌으로 왠지 부끄럽지만, 심플하게 할 수 있는 것을 알고 깔끔합니다.
실험 코드
using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
namespace ConsoleApp19
{
class Program
{
static void Main(string[] args)
{
// フォルダ内のログファイルを列挙
string targetDirPath = @"C:\Users\masa\Desktop\test";
string targetExt = "*.log";
string[] logs = Directory.GetFiles(targetDirPath, targetExt, SearchOption.TopDirectoryOnly);
// ファイル名についてる「時間+タイムゾーン」の文字列(「20191011+0900」みたいなの=「yyyyMMddzzz」を取り出すための正規表現)
string reg = "[0-9]{8}[+|-][0-9]{4}";
string format = "yyyyMMdd zzz";
var latestLogDate = logs.Where(x => Regex.Match(x, reg).Value != "") // 指定の正規表現に一致するものに絞って、
.Select(x => Regex.Match(x, reg)) // 一致した部分の文字列だけ取り出し、
.Select(x => x.Value.Insert(11, ":").Insert(8, " ")) // +0900の+09と00の間に「:」を挿入し、さらに日付とタイムゾーンの間に半角スペースを入れ、
.Select(x => DateTime.ParseExact(x, format, null)) // ParseExactでDateTimeにパースして、
.Max(); // 一番新しい日付のものを取り出す
Console.WriteLine("一番新しいログの日付は " + latestLogDate.ToString("yyyy/MM/dd") + " のログです。");
Console.ReadLine();
}
}
}
※파일명으로부터 일자를 꺼내는 정규 표현은, 개선의 여지 있을지도.
실험 코드 그 ②(20/10/31 추기, 버릇 고려 부분의 재검토)
DateTime.ParseExact()
의 버릇이 그렇지도 않다는 것을 알았으므로, 그 근처를 고려하고 있던 부분을 제외하고 깔끔하게 하고, 또한 Linq에 대해서도 코멘트 받고 있었으므로 그 부분도 조금 수정한 것이 아래와 같다. 상당히 알기 쉬워졌다.
static void Main(string[] args)
{
// フォルダ内のログファイルを列挙
string targetDirPath = @"C:\Users\masa\Desktop\test";
string targetExt = "*.log";
string[] logs = Directory.GetFiles(targetDirPath, targetExt, SearchOption.TopDirectoryOnly);
// ファイル名についてる「時間+タイムゾーン」の文字列(「20191011+0900」みたいなの=「yyyyMMddzzz」を取り出すための正規表現)
string reg = "[0-9]{8}[+|-][0-9]{4}";
string format = "yyyyMMddzzz";
var latestLogDate = logs.Select(x => Regex.Match(x, reg)) // 一致した部分の文字列だけ取り出し、
.Where(x => x.Success) // 一致するものがあったものだけに絞り、
.Select(x => DateTime.ParseExact(x.Value, format, null))// ParseExactでDateTimeにパースして、
.Max(); // 一番新しい日付のものを取り出す
Console.WriteLine("一番新しいログの日付は " + latestLogDate.ToString("yyyy/MM/dd") + " のログです。");
Console.ReadLine();
}
참고
■ 표준 날짜 및 시간 형식 지정 문자열
htps : // / cs. 미 c 로소 ft. 코 m / 자 jp / t t t / s 단지 rd / 바세 - 티 페 s / s 단 rd
■ 사용자 지정 날짜 및 시간 형식 지정 문자열
ParseExact의 포맷 지정 ( ParseExact()
라든지)에 무엇을 지정하면 좋을지 여기에서 알 수 있다.
htps : // / cs. 미 c 로소 ft. 코 m / 쟈 jp / t t t / s 단지 rd / 바세 - 티 페 s / 쿠 s와 m 다테 - 안 d 치메 - 푸마 t st 린 gs
→ 이것에 의하면, yyyyMMdd zzz
(은)는 표준의 서식 지정 캐릭터 라인이 아니고, DateTimeOffset용의 커스텀 서식 지정 캐릭터 라인인 것 같다.
■표준의 일시의 서식 지정 문자열의 일본어 해설 페이지
h tps : // t t t. p로g 라메 r-레후페렌세. 코 m / c 샤 rp - 흠 rma t /
Reference
이 문제에 관하여([C#] 문자열에서 yyyyMMdd(20201016 등)와 timezone(+0900 등)을 검색하여 DateTime으로 변환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tera1707/items/d0723b783e44388a2fe1
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
// こういうイメージ
DateTime.ParseExact("20201016+0900", "yyyyMMdd zzz", null)
@htsign 님으로부터 코멘트 받았습니다.
// こうではなく
DateTime.ParseExact("20201016+0900", "yyyyMMdd zzz", null)
// こうだとInsertとかしなくてもうまくいく様子
DateTime.ParseExact("20201016+0900", "yyyyMMddzzz", null) // ←「zzz」の前のスペースが余計だった
상기라면 특히 특별한 일을 하지 않아도 OK라는 것이 판명. 감사합니다.
이 기사의 간이라고 생각했던 부분이 무너지는 느낌으로 왠지 부끄럽지만, 심플하게 할 수 있는 것을 알고 깔끔합니다.
실험 코드
using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
namespace ConsoleApp19
{
class Program
{
static void Main(string[] args)
{
// フォルダ内のログファイルを列挙
string targetDirPath = @"C:\Users\masa\Desktop\test";
string targetExt = "*.log";
string[] logs = Directory.GetFiles(targetDirPath, targetExt, SearchOption.TopDirectoryOnly);
// ファイル名についてる「時間+タイムゾーン」の文字列(「20191011+0900」みたいなの=「yyyyMMddzzz」を取り出すための正規表現)
string reg = "[0-9]{8}[+|-][0-9]{4}";
string format = "yyyyMMdd zzz";
var latestLogDate = logs.Where(x => Regex.Match(x, reg).Value != "") // 指定の正規表現に一致するものに絞って、
.Select(x => Regex.Match(x, reg)) // 一致した部分の文字列だけ取り出し、
.Select(x => x.Value.Insert(11, ":").Insert(8, " ")) // +0900の+09と00の間に「:」を挿入し、さらに日付とタイムゾーンの間に半角スペースを入れ、
.Select(x => DateTime.ParseExact(x, format, null)) // ParseExactでDateTimeにパースして、
.Max(); // 一番新しい日付のものを取り出す
Console.WriteLine("一番新しいログの日付は " + latestLogDate.ToString("yyyy/MM/dd") + " のログです。");
Console.ReadLine();
}
}
}
※파일명으로부터 일자를 꺼내는 정규 표현은, 개선의 여지 있을지도.
실험 코드 그 ②(20/10/31 추기, 버릇 고려 부분의 재검토)
DateTime.ParseExact()
의 버릇이 그렇지도 않다는 것을 알았으므로, 그 근처를 고려하고 있던 부분을 제외하고 깔끔하게 하고, 또한 Linq에 대해서도 코멘트 받고 있었으므로 그 부분도 조금 수정한 것이 아래와 같다. 상당히 알기 쉬워졌다.
static void Main(string[] args)
{
// フォルダ内のログファイルを列挙
string targetDirPath = @"C:\Users\masa\Desktop\test";
string targetExt = "*.log";
string[] logs = Directory.GetFiles(targetDirPath, targetExt, SearchOption.TopDirectoryOnly);
// ファイル名についてる「時間+タイムゾーン」の文字列(「20191011+0900」みたいなの=「yyyyMMddzzz」を取り出すための正規表現)
string reg = "[0-9]{8}[+|-][0-9]{4}";
string format = "yyyyMMddzzz";
var latestLogDate = logs.Select(x => Regex.Match(x, reg)) // 一致した部分の文字列だけ取り出し、
.Where(x => x.Success) // 一致するものがあったものだけに絞り、
.Select(x => DateTime.ParseExact(x.Value, format, null))// ParseExactでDateTimeにパースして、
.Max(); // 一番新しい日付のものを取り出す
Console.WriteLine("一番新しいログの日付は " + latestLogDate.ToString("yyyy/MM/dd") + " のログです。");
Console.ReadLine();
}
참고
■ 표준 날짜 및 시간 형식 지정 문자열
htps : // / cs. 미 c 로소 ft. 코 m / 자 jp / t t t / s 단지 rd / 바세 - 티 페 s / s 단 rd
■ 사용자 지정 날짜 및 시간 형식 지정 문자열
ParseExact의 포맷 지정 ( ParseExact()
라든지)에 무엇을 지정하면 좋을지 여기에서 알 수 있다.
htps : // / cs. 미 c 로소 ft. 코 m / 쟈 jp / t t t / s 단지 rd / 바세 - 티 페 s / 쿠 s와 m 다테 - 안 d 치메 - 푸마 t st 린 gs
→ 이것에 의하면, yyyyMMdd zzz
(은)는 표준의 서식 지정 캐릭터 라인이 아니고, DateTimeOffset용의 커스텀 서식 지정 캐릭터 라인인 것 같다.
■표준의 일시의 서식 지정 문자열의 일본어 해설 페이지
h tps : // t t t. p로g 라메 r-레후페렌세. 코 m / c 샤 rp - 흠 rma t /
Reference
이 문제에 관하여([C#] 문자열에서 yyyyMMdd(20201016 등)와 timezone(+0900 등)을 검색하여 DateTime으로 변환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tera1707/items/d0723b783e44388a2fe1
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
namespace ConsoleApp19
{
class Program
{
static void Main(string[] args)
{
// フォルダ内のログファイルを列挙
string targetDirPath = @"C:\Users\masa\Desktop\test";
string targetExt = "*.log";
string[] logs = Directory.GetFiles(targetDirPath, targetExt, SearchOption.TopDirectoryOnly);
// ファイル名についてる「時間+タイムゾーン」の文字列(「20191011+0900」みたいなの=「yyyyMMddzzz」を取り出すための正規表現)
string reg = "[0-9]{8}[+|-][0-9]{4}";
string format = "yyyyMMdd zzz";
var latestLogDate = logs.Where(x => Regex.Match(x, reg).Value != "") // 指定の正規表現に一致するものに絞って、
.Select(x => Regex.Match(x, reg)) // 一致した部分の文字列だけ取り出し、
.Select(x => x.Value.Insert(11, ":").Insert(8, " ")) // +0900の+09と00の間に「:」を挿入し、さらに日付とタイムゾーンの間に半角スペースを入れ、
.Select(x => DateTime.ParseExact(x, format, null)) // ParseExactでDateTimeにパースして、
.Max(); // 一番新しい日付のものを取り出す
Console.WriteLine("一番新しいログの日付は " + latestLogDate.ToString("yyyy/MM/dd") + " のログです。");
Console.ReadLine();
}
}
}
DateTime.ParseExact()
의 버릇이 그렇지도 않다는 것을 알았으므로, 그 근처를 고려하고 있던 부분을 제외하고 깔끔하게 하고, 또한 Linq에 대해서도 코멘트 받고 있었으므로 그 부분도 조금 수정한 것이 아래와 같다. 상당히 알기 쉬워졌다.static void Main(string[] args)
{
// フォルダ内のログファイルを列挙
string targetDirPath = @"C:\Users\masa\Desktop\test";
string targetExt = "*.log";
string[] logs = Directory.GetFiles(targetDirPath, targetExt, SearchOption.TopDirectoryOnly);
// ファイル名についてる「時間+タイムゾーン」の文字列(「20191011+0900」みたいなの=「yyyyMMddzzz」を取り出すための正規表現)
string reg = "[0-9]{8}[+|-][0-9]{4}";
string format = "yyyyMMddzzz";
var latestLogDate = logs.Select(x => Regex.Match(x, reg)) // 一致した部分の文字列だけ取り出し、
.Where(x => x.Success) // 一致するものがあったものだけに絞り、
.Select(x => DateTime.ParseExact(x.Value, format, null))// ParseExactでDateTimeにパースして、
.Max(); // 一番新しい日付のものを取り出す
Console.WriteLine("一番新しいログの日付は " + latestLogDate.ToString("yyyy/MM/dd") + " のログです。");
Console.ReadLine();
}
참고
■ 표준 날짜 및 시간 형식 지정 문자열
htps : // / cs. 미 c 로소 ft. 코 m / 자 jp / t t t / s 단지 rd / 바세 - 티 페 s / s 단 rd
■ 사용자 지정 날짜 및 시간 형식 지정 문자열
ParseExact의 포맷 지정 ( ParseExact()
라든지)에 무엇을 지정하면 좋을지 여기에서 알 수 있다.
htps : // / cs. 미 c 로소 ft. 코 m / 쟈 jp / t t t / s 단지 rd / 바세 - 티 페 s / 쿠 s와 m 다테 - 안 d 치메 - 푸마 t st 린 gs
→ 이것에 의하면, yyyyMMdd zzz
(은)는 표준의 서식 지정 캐릭터 라인이 아니고, DateTimeOffset용의 커스텀 서식 지정 캐릭터 라인인 것 같다.
■표준의 일시의 서식 지정 문자열의 일본어 해설 페이지
h tps : // t t t. p로g 라메 r-레후페렌세. 코 m / c 샤 rp - 흠 rma t /
Reference
이 문제에 관하여([C#] 문자열에서 yyyyMMdd(20201016 등)와 timezone(+0900 등)을 검색하여 DateTime으로 변환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tera1707/items/d0723b783e44388a2fe1
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여([C#] 문자열에서 yyyyMMdd(20201016 등)와 timezone(+0900 등)을 검색하여 DateTime으로 변환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tera1707/items/d0723b783e44388a2fe1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)