Blame view

美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application/Helpers/ReportsDateTimeDisplayHelper.cs 6.41 KB
49755ef0   李曜臣   6-12代码优化
1
2
  using System.Globalization;
  
3b0c279a   杨鑫   合并
3
4
  
  
49755ef0   李曜臣   6-12代码优化
5
6
  namespace FoodLabeling.Application.Helpers;
  
3b0c279a   杨鑫   合并
7
8
  
  
49755ef0   李曜臣   6-12代码优化
9
  /// <summary>
3b0c279a   杨鑫   合并
10
11
12
  
  /// Reports Print Log 日期时间展示:统一为 <c>MM/dd/yy HH:mm</c>(精确到分钟)。
  
49755ef0   李曜臣   6-12代码优化
13
  /// </summary>
3b0c279a   杨鑫   合并
14
  
49755ef0   李曜臣   6-12代码优化
15
  public static class ReportsDateTimeDisplayHelper
3b0c279a   杨鑫   合并
16
  
49755ef0   李曜臣   6-12代码优化
17
  {
87280ae7   李曜臣   2026-0707
18
  
3b0c279a   杨鑫   合并
19
20
21
      public const string DisplayFormat = "MM/dd/yy HH:mm";
  
  
49755ef0   李曜臣   6-12代码优化
22
23
  
      private static readonly string[] ExpiryParseFormats =
3b0c279a   杨鑫   合并
24
  
49755ef0   李曜臣   6-12代码优化
25
      {
3b0c279a   杨鑫   合并
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
  
          DisplayFormat,
  
          "MM/dd/yy",
  
          "MM/dd",
  
          "yyyy-MM-dd H:mm",
  
          "yyyy-MM-dd",
  
          "yyyy/MM/dd HH:mm",
  
          "yyyy/MM/dd",
  
49755ef0   李曜臣   6-12代码优化
41
          "MM/dd/yyyy hh:mm tt",
3b0c279a   杨鑫   合并
42
  
49755ef0   李曜臣   6-12代码优化
43
          "MM/dd/yyyy h:mm tt",
3b0c279a   杨鑫   合并
44
45
46
  
          "MM/dd/yyyy HH:mm",
  
49755ef0   李曜臣   6-12代码优化
47
          "MM/dd/yyyy",
3b0c279a   杨鑫   合并
48
  
49755ef0   李曜臣   6-12代码优化
49
          "M/d/yyyy hh:mm tt",
3b0c279a   杨鑫   合并
50
  
49755ef0   李曜臣   6-12代码优化
51
          "M/d/yyyy h:mm tt",
3b0c279a   杨鑫   合并
52
  
49755ef0   李曜臣   6-12代码优化
53
          "M/d/yyyy",
3b0c279a   杨鑫   合并
54
  
49755ef0   李曜臣   6-12代码优化
55
          "dd/MM/yyyy HH:mm",
3b0c279a   杨鑫   合并
56
  
49755ef0   李曜臣   6-12代码优化
57
          "dd/MM/yyyy",
3b0c279a   杨鑫   合并
58
  
49755ef0   李曜臣   6-12代码优化
59
          "d/M/yyyy HH:mm",
3b0c279a   杨鑫   合并
60
  
49755ef0   李曜臣   6-12代码优化
61
          "d/M/yyyy",
3b0c279a   杨鑫   合并
62
  
49755ef0   李曜臣   6-12代码优化
63
64
      };
  
3b0c279a   杨鑫   合并
65
66
  
  
49755ef0   李曜臣   6-12代码优化
67
      /// <summary>打印时间展示(Printed at 列)</summary>
3b0c279a   杨鑫   合并
68
  
49755ef0   李曜臣   6-12代码优化
69
      public static string FormatPrintedAt(DateTime printedAt)
3b0c279a   杨鑫   合并
70
  
49755ef0   李曜臣   6-12代码优化
71
      {
3b0c279a   杨鑫   合并
72
  
49755ef0   李曜臣   6-12代码优化
73
          if (printedAt == DateTime.MinValue)
3b0c279a   杨鑫   合并
74
  
49755ef0   李曜臣   6-12代码优化
75
          {
3b0c279a   杨鑫   合并
76
  
49755ef0   李曜臣   6-12代码优化
77
              return "无";
3b0c279a   杨鑫   合并
78
  
49755ef0   李曜臣   6-12代码优化
79
80
          }
  
3b0c279a   杨鑫   合并
81
82
83
84
  
  
          return printedAt.ToString(DisplayFormat, CultureInfo.InvariantCulture);
  
49755ef0   李曜臣   6-12代码优化
85
86
      }
  
3b0c279a   杨鑫   合并
87
88
89
90
91
92
  
  
      /// <summary>保质期展示(Expiration 列):解析后统一为 <see cref="DisplayFormat"/></summary>
  
      public static string FormatExpiryDisplay(string? raw, DateTime? anchor = null)
  
49755ef0   李曜臣   6-12代码优化
93
      {
3b0c279a   杨鑫   合并
94
  
49755ef0   李曜臣   6-12代码优化
95
          if (string.IsNullOrWhiteSpace(raw) || string.Equals(raw.Trim(), "无", StringComparison.Ordinal))
3b0c279a   杨鑫   合并
96
  
49755ef0   李曜臣   6-12代码优化
97
          {
3b0c279a   杨鑫   合并
98
  
49755ef0   李曜臣   6-12代码优化
99
              return "无";
3b0c279a   杨鑫   合并
100
  
49755ef0   李曜臣   6-12代码优化
101
102
          }
  
3b0c279a   杨鑫   合并
103
104
  
  
49755ef0   李曜臣   6-12代码优化
105
          var s = raw.Trim();
3b0c279a   杨鑫   合并
106
107
108
109
110
111
112
113
114
115
116
117
118
  
          if (TryParseToDateTime(s, out var dt))
  
          {
  
              return dt.ToString(DisplayFormat, CultureInfo.InvariantCulture);
  
          }
  
  
  
          if (anchor.HasValue && TryParsePartialDateTime(s, anchor.Value, out dt))
  
49755ef0   李曜臣   6-12代码优化
119
          {
3b0c279a   杨鑫   合并
120
121
122
  
              return dt.ToString(DisplayFormat, CultureInfo.InvariantCulture);
  
49755ef0   李曜臣   6-12代码优化
123
124
          }
  
3b0c279a   杨鑫   合并
125
126
  
  
49755ef0   李曜臣   6-12代码优化
127
          return s;
3b0c279a   杨鑫   合并
128
  
49755ef0   李曜臣   6-12代码优化
129
130
      }
  
3b0c279a   杨鑫   合并
131
132
133
134
135
136
  
  
      /// <summary>合并日期片段(如 07/09)与时间片段(如 11:56),缺少年份时用 anchor 补全。</summary>
  
      public static string MergeDateAndTimeParts(string datePart, string timePart, DateTime anchor)
  
49755ef0   李曜臣   6-12代码优化
137
      {
3b0c279a   杨鑫   合并
138
139
140
141
142
143
144
  
          var date = datePart.Trim();
  
          var time = timePart.Trim();
  
          if (string.IsNullOrWhiteSpace(date))
  
87280ae7   李曜臣   2026-0707
145
          {
3b0c279a   杨鑫   合并
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
  
              return string.IsNullOrWhiteSpace(time) ? "无" : time;
  
          }
  
  
  
          if (!TryParsePartialDateTime(date, anchor, out var dt) && !TryParseToDateTime(date, out dt))
  
          {
  
              return string.IsNullOrWhiteSpace(time) ? date : $"{date} {time}";
  
          }
  
  
  
          if (!string.IsNullOrWhiteSpace(time))
  
          {
  
              var timeMatch = System.Text.RegularExpressions.Regex.Match(
  
                  time,
  
                  @"^(?<h>\d{1,2}):(?<m>\d{2})",
  
                  System.Text.RegularExpressions.RegexOptions.CultureInvariant);
  
              if (timeMatch.Success &&
  
                  int.TryParse(timeMatch.Groups["h"].Value, out var h) &&
  
                  int.TryParse(timeMatch.Groups["m"].Value, out var m))
  
              {
  
                  dt = new DateTime(dt.Year, dt.Month, dt.Day, h, m, 0, dt.Kind);
  
              }
  
87280ae7   李曜臣   2026-0707
187
188
          }
  
3b0c279a   杨鑫   合并
189
190
191
192
  
  
          return dt.ToString(DisplayFormat, CultureInfo.InvariantCulture);
  
87280ae7   李曜臣   2026-0707
193
194
      }
  
3b0c279a   杨鑫   合并
195
196
197
198
  
  
      private static bool TryParsePartialDateTime(string s, DateTime anchor, out DateTime dt)
  
87280ae7   李曜臣   2026-0707
199
      {
3b0c279a   杨鑫   合并
200
  
87280ae7   李曜臣   2026-0707
201
          dt = default;
87280ae7   李曜臣   2026-0707
202
  
3b0c279a   杨鑫   合并
203
204
205
206
207
208
209
210
211
212
213
214
          var text = s.Trim();
  
          var timeMatch = System.Text.RegularExpressions.Regex.Match(
  
              text,
  
              @"^(?<date>\d{1,2}/\d{1,2}(?:/\d{2,4})?)\s+(?<time>\d{1,2}:\d{2})$",
  
              System.Text.RegularExpressions.RegexOptions.CultureInvariant);
  
          if (timeMatch.Success)
  
49755ef0   李曜臣   6-12代码优化
215
          {
3b0c279a   杨鑫   合并
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
  
              text = timeMatch.Groups["date"].Value;
  
              if (TryParsePartialDateOnly(text, anchor, out dt))
  
              {
  
                  var timePart = timeMatch.Groups["time"].Value;
  
                  var parts = timePart.Split(':');
  
                  if (parts.Length == 2 &&
  
                      int.TryParse(parts[0], out var h) &&
  
                      int.TryParse(parts[1], out var m))
  
                  {
  
                      dt = new DateTime(dt.Year, dt.Month, dt.Day, h, m, 0, dt.Kind);
  
                      return true;
  
                  }
  
              }
  
49755ef0   李曜臣   6-12代码优化
243
244
          }
  
3b0c279a   杨鑫   合并
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
  
  
          return TryParsePartialDateOnly(text, anchor, out dt);
  
      }
  
  
  
      private static bool TryParsePartialDateOnly(string s, DateTime anchor, out DateTime dt)
  
      {
  
          dt = default;
  
          var parts = s.Split('/');
  
          if (parts.Length is < 2 or > 3)
  
49755ef0   李曜臣   6-12代码优化
263
          {
3b0c279a   杨鑫   合并
264
265
266
  
              return false;
  
49755ef0   李曜臣   6-12代码优化
267
268
          }
  
3b0c279a   杨鑫   合并
269
270
271
272
  
  
          if (!int.TryParse(parts[0], out var month) || !int.TryParse(parts[1], out var day))
  
49755ef0   李曜臣   6-12代码优化
273
          {
49755ef0   李曜臣   6-12代码优化
274
  
3b0c279a   杨鑫   合并
275
276
277
278
279
280
281
282
283
284
285
286
287
288
              return false;
  
          }
  
  
  
          var year = anchor.Year;
  
          if (parts.Length == 3)
  
          {
  
              if (!int.TryParse(parts[2], out var y))
  
49755ef0   李曜臣   6-12代码优化
289
              {
3b0c279a   杨鑫   合并
290
291
292
  
                  return false;
  
87280ae7   李曜臣   2026-0707
293
              }
3b0c279a   杨鑫   合并
294
295
296
297
298
  
  
  
              year = parts[2].Length == 2 ? 2000 + y : y;
  
87280ae7   李曜臣   2026-0707
299
300
          }
  
3b0c279a   杨鑫   合并
301
302
303
304
  
  
          try
  
87280ae7   李曜臣   2026-0707
305
          {
3b0c279a   杨鑫   合并
306
307
308
  
              dt = new DateTime(year, month, day, 0, 0, 0, anchor.Kind);
  
87280ae7   李曜臣   2026-0707
309
              return true;
3b0c279a   杨鑫   合并
310
  
87280ae7   李曜臣   2026-0707
311
312
          }
  
3b0c279a   杨鑫   合并
313
314
          catch
  
87280ae7   李曜臣   2026-0707
315
          {
3b0c279a   杨鑫   合并
316
317
318
  
              return false;
  
87280ae7   李曜臣   2026-0707
319
320
          }
  
87280ae7   李曜臣   2026-0707
321
322
      }
  
3b0c279a   杨鑫   合并
323
324
325
326
  
  
      private static bool TryParseToDateTime(string s, out DateTime dt)
  
87280ae7   李曜臣   2026-0707
327
      {
3b0c279a   杨鑫   合并
328
329
330
331
332
333
334
335
336
337
338
  
          if (DateTime.TryParse(
  
                  s,
  
                  CultureInfo.InvariantCulture,
  
                  DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeLocal,
  
                  out dt))
  
87280ae7   李曜臣   2026-0707
339
          {
87280ae7   李曜臣   2026-0707
340
  
87280ae7   李曜臣   2026-0707
341
              return true;
3b0c279a   杨鑫   合并
342
  
87280ae7   李曜臣   2026-0707
343
344
          }
  
3b0c279a   杨鑫   合并
345
346
347
348
349
350
351
352
353
354
355
356
  
  
          if (DateTime.TryParse(
  
                  s,
  
                  CultureInfo.GetCultureInfo("en-US"),
  
                  DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeLocal,
  
                  out dt))
  
87280ae7   李曜臣   2026-0707
357
          {
3b0c279a   杨鑫   合并
358
  
87280ae7   李曜臣   2026-0707
359
              return true;
3b0c279a   杨鑫   合并
360
  
87280ae7   李曜臣   2026-0707
361
362
          }
  
87280ae7   李曜臣   2026-0707
363
  
3b0c279a   杨鑫   合并
364
365
366
  
          foreach (var fmt in ExpiryParseFormats)
  
87280ae7   李曜臣   2026-0707
367
          {
3b0c279a   杨鑫   合并
368
  
87280ae7   李曜臣   2026-0707
369
              if (DateTime.TryParseExact(
3b0c279a   杨鑫   合并
370
  
87280ae7   李曜臣   2026-0707
371
                      s,
3b0c279a   杨鑫   合并
372
  
87280ae7   李曜臣   2026-0707
373
                      fmt,
3b0c279a   杨鑫   合并
374
  
87280ae7   李曜臣   2026-0707
375
                      CultureInfo.InvariantCulture,
3b0c279a   杨鑫   合并
376
  
87280ae7   李曜臣   2026-0707
377
                      DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeLocal,
3b0c279a   杨鑫   合并
378
379
380
  
                      out dt))
  
87280ae7   李曜臣   2026-0707
381
              {
3b0c279a   杨鑫   合并
382
  
87280ae7   李曜臣   2026-0707
383
                  return true;
3b0c279a   杨鑫   合并
384
  
87280ae7   李曜臣   2026-0707
385
386
              }
  
3b0c279a   杨鑫   合并
387
388
  
  
87280ae7   李曜臣   2026-0707
389
              if (DateTime.TryParseExact(
3b0c279a   杨鑫   合并
390
  
87280ae7   李曜臣   2026-0707
391
                      s,
3b0c279a   杨鑫   合并
392
  
87280ae7   李曜臣   2026-0707
393
                      fmt,
3b0c279a   杨鑫   合并
394
  
87280ae7   李曜臣   2026-0707
395
                      CultureInfo.GetCultureInfo("en-US"),
3b0c279a   杨鑫   合并
396
  
87280ae7   李曜臣   2026-0707
397
                      DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeLocal,
87280ae7   李曜臣   2026-0707
398
  
3b0c279a   杨鑫   合并
399
                      out dt))
87280ae7   李曜臣   2026-0707
400
  
87280ae7   李曜臣   2026-0707
401
              {
87280ae7   李曜臣   2026-0707
402
  
49755ef0   李曜臣   6-12代码优化
403
                  return true;
3b0c279a   杨鑫   合并
404
  
49755ef0   李曜臣   6-12代码优化
405
              }
3b0c279a   杨鑫   合并
406
  
49755ef0   李曜臣   6-12代码优化
407
408
          }
  
3b0c279a   杨鑫   合并
409
410
  
  
49755ef0   李曜臣   6-12代码优化
411
          return false;
3b0c279a   杨鑫   合并
412
  
49755ef0   李曜臣   6-12代码优化
413
      }
3b0c279a   杨鑫   合并
414
  
49755ef0   李曜臣   6-12代码优化
415
  }
3b0c279a   杨鑫   合并