fork download
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Text;
  5.  
  6. namespace Automaton
  7. {
  8. class Program
  9. {
  10. const string INDENT = "\t";
  11.  
  12. static void Main(string[] args)
  13. {
  14. DateTimeChecker checker = new DateTimeChecker();
  15.  
  16. List<Tuple<string, DateTimeChecker.Formats>> testCase = new List<Tuple<string, DateTimeChecker.Formats>>();
  17. testCase.Add(Tuple.Create("2018/11/16 12:34:56.789", DateTimeChecker.Formats.yyyyMMddHHmmssfff));
  18. testCase.Add(Tuple.Create("2018/11/16 12:34:56.78", DateTimeChecker.Formats.None));
  19. testCase.Add(Tuple.Create("2018/11/16 12:34:56.7", DateTimeChecker.Formats.None));
  20. testCase.Add(Tuple.Create("2018/11/16 12:34:56.", DateTimeChecker.Formats.None));
  21. testCase.Add(Tuple.Create("2018/11/16 12:34:56", DateTimeChecker.Formats.yyyyMMddHHmmss));
  22. testCase.Add(Tuple.Create("2018/11/16 12:34:5", DateTimeChecker.Formats.None));
  23. testCase.Add(Tuple.Create("2018/11/16 12:34:", DateTimeChecker.Formats.None));
  24. testCase.Add(Tuple.Create("2018/11/16 12:34", DateTimeChecker.Formats.yyyyMMddHHmm));
  25. testCase.Add(Tuple.Create("2018/11/16 12:3", DateTimeChecker.Formats.None));
  26. testCase.Add(Tuple.Create("2018/11/16 12:", DateTimeChecker.Formats.None));
  27. testCase.Add(Tuple.Create("2018/11/16 12", DateTimeChecker.Formats.yyyyMMddHH));
  28. testCase.Add(Tuple.Create("2018/11/16 1", DateTimeChecker.Formats.None));
  29. testCase.Add(Tuple.Create("2018/11/16 ", DateTimeChecker.Formats.None));
  30. testCase.Add(Tuple.Create("2018/11/16", DateTimeChecker.Formats.yyyyMMdd));
  31. testCase.Add(Tuple.Create("2018/11/1", DateTimeChecker.Formats.None));
  32. testCase.Add(Tuple.Create("2018/11/", DateTimeChecker.Formats.None));
  33. testCase.Add(Tuple.Create("2018/11", DateTimeChecker.Formats.yyyyMM));
  34. testCase.Add(Tuple.Create("2018/1", DateTimeChecker.Formats.None));
  35. testCase.Add(Tuple.Create("2018/", DateTimeChecker.Formats.None));
  36. testCase.Add(Tuple.Create("2018", DateTimeChecker.Formats.None));
  37. testCase.Add(Tuple.Create("201", DateTimeChecker.Formats.None));
  38. testCase.Add(Tuple.Create("20", DateTimeChecker.Formats.None));
  39. testCase.Add(Tuple.Create("2", DateTimeChecker.Formats.None));
  40. testCase.Add(Tuple.Create("", DateTimeChecker.Formats.None));
  41. TestDateTime(checker, testCase);
  42. checker.Reset();
  43. testCase.Clear();
  44.  
  45. testCase.Add(Tuple.Create("18/11/16 12:34:56.789", DateTimeChecker.Formats.yyMMddHHmmssfff));
  46. testCase.Add(Tuple.Create("18/11/16 12:34:56.78", DateTimeChecker.Formats.None));
  47. testCase.Add(Tuple.Create("18/11/16 12:34:56.7", DateTimeChecker.Formats.None));
  48. testCase.Add(Tuple.Create("18/11/16 12:34:56.", DateTimeChecker.Formats.None));
  49. testCase.Add(Tuple.Create("18/11/16 12:34:56", DateTimeChecker.Formats.yyMMddHHmmss));
  50. testCase.Add(Tuple.Create("18/11/16 12:34:5", DateTimeChecker.Formats.None));
  51. testCase.Add(Tuple.Create("18/11/16 12:34:", DateTimeChecker.Formats.None));
  52. testCase.Add(Tuple.Create("18/11/16 12:34", DateTimeChecker.Formats.yyMMddHHmm));
  53. testCase.Add(Tuple.Create("18/11/16 12:3", DateTimeChecker.Formats.None));
  54. testCase.Add(Tuple.Create("18/11/16 12:", DateTimeChecker.Formats.None));
  55. testCase.Add(Tuple.Create("18/11/16 12", DateTimeChecker.Formats.yyMMddHH));
  56. testCase.Add(Tuple.Create("18/11/16 1", DateTimeChecker.Formats.None));
  57. testCase.Add(Tuple.Create("18/11/16 ", DateTimeChecker.Formats.None));
  58. testCase.Add(Tuple.Create("18/11/16", DateTimeChecker.Formats.yyMMdd));
  59. testCase.Add(Tuple.Create("18/11/1", DateTimeChecker.Formats.None));
  60. testCase.Add(Tuple.Create("18/11/", DateTimeChecker.Formats.None));
  61. testCase.Add(Tuple.Create("18/11", DateTimeChecker.Formats.MMdd));
  62. testCase.Add(Tuple.Create("18/1", DateTimeChecker.Formats.None));
  63. testCase.Add(Tuple.Create("18/", DateTimeChecker.Formats.None));
  64. testCase.Add(Tuple.Create("18", DateTimeChecker.Formats.None));
  65. testCase.Add(Tuple.Create("1", DateTimeChecker.Formats.None));
  66. TestDateTime(checker, testCase);
  67. checker.Reset();
  68. testCase.Clear();
  69.  
  70. testCase.Add(Tuple.Create("11/16 12:34:56.789", DateTimeChecker.Formats.MMddHHmmssfff));
  71. testCase.Add(Tuple.Create("11/16 12:34:56.78", DateTimeChecker.Formats.None));
  72. testCase.Add(Tuple.Create("11/16 12:34:56.7", DateTimeChecker.Formats.None));
  73. testCase.Add(Tuple.Create("11/16 12:34:56.", DateTimeChecker.Formats.None));
  74. testCase.Add(Tuple.Create("11/16 12:34:56", DateTimeChecker.Formats.MMddHHmmss));
  75. testCase.Add(Tuple.Create("11/16 12:34:5", DateTimeChecker.Formats.None));
  76. testCase.Add(Tuple.Create("11/16 12:34:", DateTimeChecker.Formats.None));
  77. testCase.Add(Tuple.Create("11/16 12:34", DateTimeChecker.Formats.MMddHHmm));
  78. testCase.Add(Tuple.Create("11/16 12:3", DateTimeChecker.Formats.None));
  79. testCase.Add(Tuple.Create("11/16 12:", DateTimeChecker.Formats.None));
  80. testCase.Add(Tuple.Create("11/16 12", DateTimeChecker.Formats.MMddHH));
  81. testCase.Add(Tuple.Create("11/16 1", DateTimeChecker.Formats.None));
  82. testCase.Add(Tuple.Create("11/16 ", DateTimeChecker.Formats.None));
  83. testCase.Add(Tuple.Create("11/16", DateTimeChecker.Formats.MMdd));
  84. testCase.Add(Tuple.Create("11/1", DateTimeChecker.Formats.None));
  85. testCase.Add(Tuple.Create("11/", DateTimeChecker.Formats.None));
  86. testCase.Add(Tuple.Create("11", DateTimeChecker.Formats.None));
  87. testCase.Add(Tuple.Create("1", DateTimeChecker.Formats.None));
  88. TestDateTime(checker, testCase);
  89. checker.Reset();
  90. testCase.Clear();
  91.  
  92. testCase.Add(Tuple.Create("12:34:56.789", DateTimeChecker.Formats.HHmmssfff));
  93. testCase.Add(Tuple.Create("12:34:56.78", DateTimeChecker.Formats.None));
  94. testCase.Add(Tuple.Create("12:34:56.7", DateTimeChecker.Formats.None));
  95. testCase.Add(Tuple.Create("12:34:56.", DateTimeChecker.Formats.None));
  96. testCase.Add(Tuple.Create("12:34:56", DateTimeChecker.Formats.HHmmss));
  97. testCase.Add(Tuple.Create("12:34:5", DateTimeChecker.Formats.None));
  98. testCase.Add(Tuple.Create("12:34:", DateTimeChecker.Formats.None));
  99. testCase.Add(Tuple.Create("12:34", DateTimeChecker.Formats.HHmm));
  100. testCase.Add(Tuple.Create("12:3", DateTimeChecker.Formats.None));
  101. testCase.Add(Tuple.Create("12:", DateTimeChecker.Formats.None));
  102. testCase.Add(Tuple.Create("12", DateTimeChecker.Formats.None));
  103. testCase.Add(Tuple.Create("1", DateTimeChecker.Formats.None));
  104. TestDateTime(checker, testCase);
  105. checker.Reset();
  106. testCase.Clear();
  107.  
  108. testCase.Add(Tuple.Create("34:56.789", DateTimeChecker.Formats.mmssfff));
  109. testCase.Add(Tuple.Create("34:56.78", DateTimeChecker.Formats.None));
  110. testCase.Add(Tuple.Create("34:56.7", DateTimeChecker.Formats.None));
  111. testCase.Add(Tuple.Create("34:56.", DateTimeChecker.Formats.None));
  112. testCase.Add(Tuple.Create("34:56", DateTimeChecker.Formats.HHmm));
  113. testCase.Add(Tuple.Create("34:5", DateTimeChecker.Formats.None));
  114. testCase.Add(Tuple.Create("34:", DateTimeChecker.Formats.None));
  115. testCase.Add(Tuple.Create("34", DateTimeChecker.Formats.None));
  116. testCase.Add(Tuple.Create("3", DateTimeChecker.Formats.None));
  117. TestDateTime(checker, testCase);
  118. checker.Reset();
  119. testCase.Clear();
  120. }
  121.  
  122. static void TestDateTime(DateTimeChecker checker, IList<Tuple<string, DateTimeChecker.Formats>> testCase)
  123. {
  124. foreach (Tuple<string, DateTimeChecker.Formats> t in testCase)
  125. {
  126. Console.Write("[" + t.Item1 + "] ");
  127. checker.Reset();
  128. foreach (char ch in t.Item1)
  129. {
  130. checker.MoveNext(ch);
  131. if (checker.IsError())
  132. {
  133. Console.Write(INDENT);
  134. Console.WriteLine(":ERROR");
  135. Debug.Assert(checker.Format == t.Item2, "asersion failed!!");
  136. break;
  137. }
  138. }
  139.  
  140. if (!checker.IsError())
  141. {
  142. if (checker.IsAcceptable())
  143. {
  144. Console.Write(INDENT);
  145. Console.Write(":OK");
  146. Console.Write(INDENT);
  147. Console.WriteLine(checker.Format);
  148. Debug.Assert(checker.Format == t.Item2, t.Item1 + " asersion failed!!");
  149. }
  150. else
  151. {
  152. Console.Write(INDENT);
  153. Console.WriteLine(":NG");
  154. Debug.Assert(checker.Format == t.Item2, "asersion failed!!");
  155. }
  156. }
  157. }
  158. }
  159. }
  160.  
  161. interface Checker
  162. {
  163. void Reset();
  164. void MoveNext(char ch);
  165. bool IsAcceptable();
  166. bool IsError();
  167. bool IsNextError(char ch);
  168. string Current();
  169. }
  170.  
  171. class DateTimeChecker : Checker
  172. {
  173. /// <summary>formats for date or time</summary>
  174. public enum Formats
  175. {
  176. /// <summary>nether date nor time</summary>
  177. None,
  178. /// <summary>yyyy/MM/dd HH:mm:ss.fff</summary>
  179. yyyyMMddHHmmssfff,
  180. /// <summary>yyyy/MM/dd HH:mm:ss</summary>
  181. yyyyMMddHHmmss,
  182. /// <summary>yyyy/MM/dd HH:mm</summary>
  183. yyyyMMddHHmm,
  184. /// <summary>yyyy/MM/dd HH</summary>
  185. yyyyMMddHH,
  186. /// <summary>yyyy/MM/dd</summary>
  187. yyyyMMdd,
  188. /// <summary>yyyy/MM</summary>
  189. yyyyMM,
  190. /// <summary>yy/MM/dd HH:mm:ss.fff</summary>
  191. yyMMddHHmmssfff,
  192. /// <summary>yy/MM/dd HH:mm:ss</summary>
  193. yyMMddHHmmss,
  194. /// <summary>yy/MM/dd HH:mm</summary>
  195. yyMMddHHmm,
  196. /// <summary>yy/MM/dd HH</summary>
  197. yyMMddHH,
  198. /// <summary>yy/MM/dd</summary>
  199. yyMMdd,
  200. /// <summary>MM/dd HH:mm:ss.fff</summary>
  201. MMddHHmmssfff,
  202. /// <summary>MM/dd HH:mm:ss</summary>
  203. MMddHHmmss,
  204. /// <summary>MM/dd HH:mm</summary>
  205. MMddHHmm,
  206. /// <summary>MM/dd HH</summary>
  207. MMddHH,
  208. /// <summary>MM/dd</summary>
  209. MMdd,
  210. /// <summary>HH:mm:ss.fff</summary>
  211. HHmmssfff,
  212. /// <summary>HH:mm:ss</summary>
  213. HHmmss,
  214. /// <summary>HH:mm</summary>
  215. HHmm,
  216. /// <summary>mm:ss.fff</summary>
  217. mmssfff,
  218. }
  219.  
  220. enum States
  221. {
  222. Error,
  223. State00,
  224. State01,
  225. State02,
  226. State03,
  227. State04,
  228. State05,
  229. State06,
  230. State07,
  231. State08,
  232. State09,
  233. State10,
  234. State11,
  235. State12,
  236. State13,
  237. State14,
  238. State15,
  239. State16,
  240. State17,
  241. State18,
  242. State19,
  243. State20,
  244. State21,
  245. State22,
  246. State23,
  247. State24,
  248. State25,
  249. State26,
  250. State27,
  251. State28,
  252. State29,
  253. }
  254.  
  255. StringBuilder _sb;
  256. States _state;
  257. List<States> _breadcrumb;
  258. Formats _format;
  259.  
  260. public Formats Format
  261. {
  262. get { return _format; }
  263. }
  264.  
  265. public DateTimeChecker()
  266. {
  267. _sb = new StringBuilder();
  268. _breadcrumb = new List<States>();
  269. Reset();
  270. }
  271.  
  272. public void Reset()
  273. {
  274. _state = States.State00;
  275. _sb.Clear();
  276. _breadcrumb.Clear();
  277. _format = Formats.None;
  278. }
  279.  
  280. public void MoveNext(char ch)
  281. {
  282. _sb.Append(ch);
  283. States oldState = _state;
  284. _state = GetNext(ch);
  285. JudgeFormat();
  286. }
  287.  
  288. void JudgeFormat()
  289. {
  290. if (_state == States.State17)
  291. {
  292. _format = Formats.yyyyMM;
  293. _breadcrumb.Add(_state);
  294. }
  295. else if (_state == States.State10)
  296. {
  297. _format = Formats.MMdd;
  298. _breadcrumb.Add(_state);
  299. }
  300. else if (_state == States.State11)
  301. {
  302. _format = Formats.HHmm;
  303. _breadcrumb.Add(_state);
  304. }
  305. else if (_state == States.State22)
  306. {
  307. // there are two ways to come here.
  308. if (_breadcrumb[_breadcrumb.Count - 1] == States.State17)
  309. {
  310. _format = Formats.yyyyMMdd;
  311. }
  312. else
  313. {
  314. _format = Formats.yyMMdd;
  315. }
  316. _breadcrumb.Add(_state);
  317. }
  318. else if (_state == States.State23)
  319. {
  320. // there are three ways to come here.
  321. if (_breadcrumb[_breadcrumb.Count - 1] == States.State10)
  322. {
  323. _format = Formats.MMddHH;
  324. }
  325. else if (_breadcrumb[_breadcrumb.Count - 2] == States.State10)
  326. {
  327. _format = Formats.yyMMddHH;
  328. }
  329. else
  330. {
  331. _format = Formats.yyyyMMddHH;
  332. }
  333. _breadcrumb.Add(_state);
  334. }
  335. else if (_state == States.State29)
  336. {
  337. // there are three ways to come here.
  338. if (_breadcrumb[_breadcrumb.Count - 2] == States.State10)
  339. {
  340. _format = Formats.MMddHHmm;
  341. }
  342. else if (_breadcrumb[_breadcrumb.Count - 3] == States.State10)
  343. {
  344. _format = Formats.yyMMddHHmm;
  345. }
  346. else
  347. {
  348. _format = Formats.yyyyMMddHHmm;
  349. }
  350. _breadcrumb.Add(_state);
  351. }
  352. else if (_state == States.State24)
  353. {
  354. // there are four ways to come here.
  355. if (_breadcrumb[_breadcrumb.Count - 1] == States.State11)
  356. {
  357. _format = Formats.HHmmss;
  358. }
  359. else if (_breadcrumb[_breadcrumb.Count - 3] == States.State10)
  360. {
  361. _format = Formats.MMddHHmmss;
  362. }
  363. else if (_breadcrumb[_breadcrumb.Count - 4] == States.State10)
  364. {
  365. _format = Formats.yyMMddHHmmss;
  366. }
  367. else
  368. {
  369. _format = Formats.yyyyMMddHHmmss;
  370. }
  371. _breadcrumb.Add(_state);
  372. }
  373. else if (_state == States.State27)
  374. {
  375. // there are five ways to come here.
  376. if (_breadcrumb[_breadcrumb.Count - 1] == States.State11)
  377. {
  378. _format = Formats.mmssfff;
  379. }
  380. else if (_breadcrumb[_breadcrumb.Count - 2] == States.State11)
  381. {
  382. _format = Formats.HHmmssfff;
  383. }
  384. else if (_breadcrumb[_breadcrumb.Count - 4] == States.State10)
  385. {
  386. _format = Formats.MMddHHmmssfff;
  387. }
  388. else if (_breadcrumb[_breadcrumb.Count - 5] == States.State10)
  389. {
  390. _format = Formats.yyMMddHHmmssfff;
  391. }
  392. else
  393. {
  394. _format = Formats.yyyyMMddHHmmssfff;
  395. }
  396. _breadcrumb.Add(_state);
  397. }
  398. else
  399. {
  400. _format = Formats.None;
  401. }
  402. }
  403.  
  404. public bool IsAcceptable()
  405. {
  406. return
  407. _state == States.State10
  408. || _state == States.State11
  409. || _state == States.State17
  410. || _state == States.State22
  411. || _state == States.State23
  412. || _state == States.State24
  413. || _state == States.State27
  414. || _state == States.State29;
  415. }
  416.  
  417. public bool IsError()
  418. {
  419. return _state == States.Error;
  420. }
  421.  
  422. public bool IsNextError(char ch)
  423. {
  424. States next = GetNext(ch);
  425. return IsError(next);
  426. }
  427.  
  428. public string Current()
  429. {
  430. return _sb.ToString();
  431. }
  432.  
  433.  
  434.  
  435.  
  436.  
  437. States GetNext(char ch)
  438. {
  439. States next = States.Error;
  440. switch (_state)
  441. {
  442. case States.State00:
  443. next = Transition(ch, States.State01, States.Error, States.Error, States.Error, States.Error);
  444. break;
  445. case States.State01:
  446. next = Transition(ch, States.State02, States.Error, States.Error, States.Error, States.Error);
  447. break;
  448. case States.State02:
  449. next = Transition(ch, States.State03, States.State04, States.Error, States.State05, States.Error);
  450. break;
  451. case States.State03:
  452. next = Transition(ch, States.State06, States.Error, States.Error, States.Error, States.Error);
  453. break;
  454. case States.State04:
  455. next = Transition(ch, States.State07, States.Error, States.Error, States.Error, States.Error);
  456. break;
  457. case States.State05:
  458. next = Transition(ch, States.State08, States.Error, States.Error, States.Error, States.Error);
  459. break;
  460. case States.State06:
  461. next = Transition(ch, States.Error, States.State09, States.Error, States.Error, States.Error);
  462. break;
  463. case States.State07:
  464. next = Transition(ch, States.State10, States.Error, States.Error, States.Error, States.Error);
  465. break;
  466. case States.State08:
  467. next = Transition(ch, States.State11, States.Error, States.Error, States.Error, States.Error);
  468. break;
  469. case States.State09:
  470. next = Transition(ch, States.State12, States.Error, States.Error, States.Error, States.Error);
  471. break;
  472. case States.State10:
  473. next = Transition(ch, States.Error, States.State13, States.State14, States.Error, States.Error);
  474. break;
  475. case States.State11:
  476. next = Transition(ch, States.Error, States.Error, States.Error, States.State15, States.State16);
  477. break;
  478. case States.State12:
  479. next = Transition(ch, States.State17, States.Error, States.Error, States.Error, States.Error);
  480. break;
  481. case States.State13:
  482. next = Transition(ch, States.State18, States.Error, States.Error, States.Error, States.Error);
  483. break;
  484. case States.State14:
  485. next = Transition(ch, States.State19, States.Error, States.Error, States.Error, States.Error);
  486. break;
  487. case States.State15:
  488. next = Transition(ch, States.State20, States.Error, States.Error, States.Error, States.Error);
  489. break;
  490. case States.State16:
  491. next = Transition(ch, States.State21, States.Error, States.Error, States.Error, States.Error);
  492. break;
  493. case States.State17:
  494. next = Transition(ch, States.Error, States.State13, States.Error, States.Error, States.Error);
  495. break;
  496. case States.State18:
  497. next = Transition(ch, States.State22, States.Error, States.Error, States.Error, States.Error);
  498. break;
  499. case States.State19:
  500. next = Transition(ch, States.State23, States.Error, States.Error, States.Error, States.Error);
  501. break;
  502. case States.State20:
  503. next = Transition(ch, States.State24, States.Error, States.Error, States.Error, States.Error);
  504. break;
  505. case States.State21:
  506. next = Transition(ch, States.State25, States.Error, States.Error, States.Error, States.Error);
  507. break;
  508. case States.State22:
  509. next = Transition(ch, States.Error, States.Error, States.State14, States.Error, States.Error);
  510. break;
  511. case States.State23:
  512. next = Transition(ch, States.Error, States.Error, States.Error, States.State26, States.Error);
  513. break;
  514. case States.State24:
  515. next = Transition(ch, States.Error, States.Error, States.Error, States.Error, States.State16);
  516. break;
  517. case States.State25:
  518. next = Transition(ch, States.State27, States.Error, States.Error, States.Error, States.Error);
  519. break;
  520. case States.State26:
  521. next = Transition(ch, States.State28, States.Error, States.Error, States.Error, States.Error);
  522. break;
  523. case States.State27:
  524. next = Transition(ch, States.Error, States.Error, States.Error, States.Error, States.Error);
  525. break;
  526. case States.State28:
  527. next = Transition(ch, States.State29, States.Error, States.Error, States.Error, States.Error);
  528. break;
  529. case States.State29:
  530. next = Transition(ch, States.Error, States.Error, States.Error, States.State15, States.Error);
  531. break;
  532. default:
  533. next = States.Error;
  534. break;
  535. }
  536. return next;
  537. }
  538.  
  539. static States Transition(char ch, States whenDigit, States whenSlash, States whenSpace, States whenColon, States whenDot)
  540. {
  541. States next = States.Error;
  542.  
  543. if (char.IsDigit(ch))
  544. {
  545. next = whenDigit;
  546. }
  547. else if (ch == '/')
  548. {
  549. next = whenSlash;
  550. }
  551. else if (ch == ' ')
  552. {
  553. next = whenSpace;
  554. }
  555. else if (ch == ':')
  556. {
  557. next = whenColon;
  558. }
  559. else if (ch == '.')
  560. {
  561. next = whenDot;
  562. }
  563. else
  564. {
  565. next = States.Error;
  566. }
  567.  
  568. return next;
  569. }
  570.  
  571. static bool IsError(States state)
  572. {
  573. return state == States.Error;
  574. }
  575. }
  576. }
Success #stdin #stdout 0.01s 131520KB
stdin
Standard input is empty
stdout
[2018/11/16 12:34:56.789] 	:OK	yyyyMMddHHmmssfff
[2018/11/16 12:34:56.78] 	:NG
[2018/11/16 12:34:56.7] 	:NG
[2018/11/16 12:34:56.] 	:NG
[2018/11/16 12:34:56] 	:OK	yyyyMMddHHmmss
[2018/11/16 12:34:5] 	:NG
[2018/11/16 12:34:] 	:NG
[2018/11/16 12:34] 	:OK	yyyyMMddHHmm
[2018/11/16 12:3] 	:NG
[2018/11/16 12:] 	:NG
[2018/11/16 12] 	:OK	yyyyMMddHH
[2018/11/16 1] 	:NG
[2018/11/16 ] 	:NG
[2018/11/16] 	:OK	yyyyMMdd
[2018/11/1] 	:NG
[2018/11/] 	:NG
[2018/11] 	:OK	yyyyMM
[2018/1] 	:NG
[2018/] 	:NG
[2018] 	:NG
[201] 	:NG
[20] 	:NG
[2] 	:NG
[] 	:NG
[18/11/16 12:34:56.789] 	:OK	yyMMddHHmmssfff
[18/11/16 12:34:56.78] 	:NG
[18/11/16 12:34:56.7] 	:NG
[18/11/16 12:34:56.] 	:NG
[18/11/16 12:34:56] 	:OK	yyMMddHHmmss
[18/11/16 12:34:5] 	:NG
[18/11/16 12:34:] 	:NG
[18/11/16 12:34] 	:OK	yyMMddHHmm
[18/11/16 12:3] 	:NG
[18/11/16 12:] 	:NG
[18/11/16 12] 	:OK	yyMMddHH
[18/11/16 1] 	:NG
[18/11/16 ] 	:NG
[18/11/16] 	:OK	yyMMdd
[18/11/1] 	:NG
[18/11/] 	:NG
[18/11] 	:OK	MMdd
[18/1] 	:NG
[18/] 	:NG
[18] 	:NG
[1] 	:NG
[11/16 12:34:56.789] 	:OK	MMddHHmmssfff
[11/16 12:34:56.78] 	:NG
[11/16 12:34:56.7] 	:NG
[11/16 12:34:56.] 	:NG
[11/16 12:34:56] 	:OK	MMddHHmmss
[11/16 12:34:5] 	:NG
[11/16 12:34:] 	:NG
[11/16 12:34] 	:OK	MMddHHmm
[11/16 12:3] 	:NG
[11/16 12:] 	:NG
[11/16 12] 	:OK	MMddHH
[11/16 1] 	:NG
[11/16 ] 	:NG
[11/16] 	:OK	MMdd
[11/1] 	:NG
[11/] 	:NG
[11] 	:NG
[1] 	:NG
[12:34:56.789] 	:OK	HHmmssfff
[12:34:56.78] 	:NG
[12:34:56.7] 	:NG
[12:34:56.] 	:NG
[12:34:56] 	:OK	HHmmss
[12:34:5] 	:NG
[12:34:] 	:NG
[12:34] 	:OK	HHmm
[12:3] 	:NG
[12:] 	:NG
[12] 	:NG
[1] 	:NG
[34:56.789] 	:OK	mmssfff
[34:56.78] 	:NG
[34:56.7] 	:NG
[34:56.] 	:NG
[34:56] 	:OK	HHmm
[34:5] 	:NG
[34:] 	:NG
[34] 	:NG
[3] 	:NG