Unity 之 切换语言导致报错:System.FormatException:String was not recognized as a valid DateTime.

  • 一,发生问题
    • 1.1 问题背景
    • 1.2 报错日志
  • 二,定位问题
    • 2.1 测试用例
    • 2.2 找到问题
  • 三,解决问题
    • 3.1 尝试解决
    • 3.2 解决问题

一,发生问题

1.1 问题背景

最近在开发多语言本地化时(简体-繁体来回切换),发生了这个错误:System.FormatException: String was not recognized as a valid DateTime. --> 系统格式异常:字符串未被识别为有效的日期时间。

看起来是逻辑上错误传了一个错误的字符串给DateTime.Parse(“”)方法作为参数了。那么奇怪的是在编辑器下没有发生错误,在真机不切换语言的情况也没有发生错误,只有在IOS切换简繁体系统语言时会发生这个错误

于是猜测在不同语言环境下DateTime.Now.ToString()得到的结果是不同的,所以就有了2.1的测试用例。

1.2 报错日志

真机切换语言捕获的错误日志:

System.AggregateException: One or more errors occurred. ---> System.FormatException: String was not recognized as a valid DateTime.at System.DateTimeParse.Parse (System.String s, System.Globalization.DateTimeFormatInfo dtfi, System.Globalization.DateTimeStyles styles) [0x00000] in <00000000000000000000000000000000>:0 at WZC.ActivityManager+<>c__DisplayClass45_0.<GetActivitySwitchConfig>b__0 (WZC.ActivitySwitchConfig e) [0x00000] in <00000000000000000000000000000000>:0 at System.Threading.ContextCallback.Invoke (System.Object state) [0x00000] in <00000000000000000000000000000000>:0 at System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00000] in <00000000000000000000000000000000>:0 at System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner.Run () [0x00000] in <00000000000000000000000000000000>:0 at System.Action.Invoke () [0x00000] in <00000000000000000000000000000000>:0 at System.Threading.ContextCallback.Invoke (System.Object state) [0x00000] in <00000000000000000000000000000000>:0 at System.Threading.Tasks.AwaitTaskContinuation.RunCallback (System.Threading.ContextCallback callback, System.Object state, System.Threading.Tasks.Task& currentTask) [0x00000] in <00000000000000000000000000000000>:0 at System.Threading.Tasks.Task`1[TResult].TrySetResult (TResult result) [0x00000] in <00000000000000000000000000000000>:0 at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1[TResult].Create () [0x00000] in <00000000000000000000000000000000>:0 at WZC.ApiHelper..cctor () [0x00000] in <00000000000000000000000000000000>:0 at System.Threading.ContextCallback.Invoke (System.Object state) [0x00000] in <00000000000000000000000000000000>:0 at System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00000] in <00000000000000000000000000000000>:0 at System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner.Run () [0x00000] in <00000000000000000000000000000000>:0 at System.Action.Invoke () [0x00000] in <00000000000000000000000000000000>:0 at System.Threading.ContextCallback.Invoke (System.Object state) [0x00000] in <00000000000000000000000000000000>:0 --- End of inner exception stack trace ---

二,定位问题

2.1 测试用例

按照游戏逻辑还原了DateTime的使用情况,为了方便观察日志创建了Scroll View组件,里面放一个很长的Text,测试代码和场景搭建效果如下:

using System;
using UnityEngine;
using UnityEngine.UI;public class ConverTimeError : MonoBehaviour
{public Text context;public Button cunShiJian;public Button quShiJian;void Start(){var strRus = PlayerPrefs.GetString("Hall:RegionGetDate");var strRusDate = DateTime.Parse(strRus);context.text += "转换结果:+++" +  strRusDate.Year + "/" + strRusDate.Month+ "/" + strRusDate.Day + ";\n";cunShiJian.onClick.AddListener(()=>{context.text += "存时间 :---" + DateTime.Now + ";\n";PlayerPrefs.SetString("Hall:RegionGetDate", DateTime.Now.ToString());context.text += "存储结果:---" +  PlayerPrefs.GetString("Hall:RegionGetDate") + ";\n";});quShiJian.onClick.AddListener(()=>{context.text += "取时间 :+++" + DateTime.Now + ";\n";var regionGetDateStr = PlayerPrefs.GetString("Hall:RegionGetDate");context.text += "取到结果:+++" +  regionGetDateStr + ";\n";var regionGetDate = DateTime.Parse(regionGetDateStr);context.text += "取到转换结果:+++" +  regionGetDate.Year + "/" + regionGetDate.Month+ "/" + regionGetDate.Day + ";\n";});}
}

使用此测试用例在macOS和IOS上都进行了切换语言的测试,结果都没有任何异常,发现DateTime.Now.ToString()的结果都是:月/日/年 时:分:秒 这种格式。


2.2 找到问题

测试用例没发现问题,那不得不在原工程中补日志了,几经周折最后确定了有一个存时间的字符串格式为日/月/年 时:分:秒

于是在编辑器中模拟转换了年/月/日月/日/年日/月/年 三种格式的时间转换:

Debug.Log("年/月/日: " + DateTime.Parse("2022/7/25 13:11:00"));
Debug.Log("月/日/年: " + DateTime.Parse("7/25/2022 13:11:00"));
// 有问题的时间格式转换
Debug.Log("日/月/年: " + DateTime.Parse("25/7/2022 13:11:00"));

结果表明:日/月/年这种格式的字符串确实不能使用DateTime.Parse()方法进行转换。

那么新的问题就来了,在时间存储时使用的是:DateTime.Now.ToString(),而在2.1的测试用例中我们有确认了DateTime.Now.ToString()的结果都是:月/日/年 时:分:秒 这种格式。

同时又可以确定的是游戏中存储时间使用的都是DateTime.Now.ToString()这种形式,这就很让人费解游戏逻辑中日/月/年格式的字符串是怎么出来的呢?


三,解决问题

3.1 尝试解决

刚开始是使用了

DateTime.ParseExact(DateTime.Now.ToString(), "yyyy/dd/MM", System.Globalization.CultureInfo.InvariantCulture);

这个方法来进行格式转换,因为这是指定格式的转换,所以根据上面的测试结果也是不行的。

3.2 解决问题

将存储的代码固定格式为:

DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss")

好在工程里面只有几处DateTime.Now的赋值,修改起来还是很方便的。最后也测试通过了。

遇到了这么奇怪的问题,记录一下,供遇到相似问题童鞋参考一下。

Unity 之 切换语言导致报错:System.FormatException:String was not recognized as a valid DateTime.相关推荐

  1. SAP COR2下达工单,报错 System status APNG is active 之对策

    SAP COR2下达工单,报错 System status APNG is active 之对策 笔者发现,在项目上的SAP系统上使用事务代码COR2去release某个工单,得到如下报错信息: 这种 ...

  2. mtk一键usb驱动_三菱MRJEB驱动器报错,导致报错原因37.1参数设置范围异常?

    三菱MR-JE-B驱动器报错,导致报错原因37.1参数设置范围异常?最近海蓝机电工程师们在做一个项目,做的是三菱MR-JE-B驱动器.工程师们在实操这个项目过程中遇到各种问题,其中就像驱动器报错的问题 ...

  3. win10添加计算机语言,Win10添加语言包报错“0x800F0950”怎么办?

    Win10添加语言包报错"0x800F0950"怎么办?在使用Win10系统的过程中,有时候我们需要添加语言,来实现一些工作需求,然而有用户遇到添加语言包失败的情况,系统提示错误代 ...

  4. python操作html的object_关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题...

    有的bug,莫名其妙就好了- python3.9 报错 "AttributeError: 'HTMLParser' object has no attribute 'unescape'&qu ...

  5. 报错System.ComponentModel.Win32Exception:“系统找不到指定的文件。”

    问题: 使用C#语言在Visual Studio2019中运用RichTextBox控件添加超链接,运行程序点击超链接报错System.ComponentModel.Win32Exception:&q ...

  6. 安卓没删干净导致报错

    安卓没删干净导致报错,要到放安卓文件的位置去删!!! 转载于:https://www.cnblogs.com/yuanyifei/p/4154888.html

  7. 二级c语言程序设计翻译,C语言程序设计报错英文翻译

    C语言程序设计报错英文翻译 C++出错提示英汉对照表 来源: 杨赫的日志 Ambiguous operators need parentheses -----------不明确的运算需要用括号括起- ...

  8. SylixOS移植常见问题——编译过多文件导致报错

    问题复现: 由于RealEvo IDE在Windows下使用的sh.exe支持的命令长度有限(命令要小于16K),如果需要编译的源文件过多,可能会报溢出错误或"make (e=87): 参数 ...

  9. Git 无法切换分支,报错git did not exit cleanly

    Git 无法切换分支,报错git did not exit cleanly 今天从做内存泄漏测试需要切换Git分支,checkout 的时候发现报错git did not exit cleanly. ...

最新文章

  1. java 实例化 bean,Spring(02)——bean实例化
  2. 网上搜集第三方(一)
  3. 我的MAXSCRIPT笔记
  4. python练习--模拟grep -B功能
  5. sqlserver 如何把一列分为一行显示_SqlServer数据库如何快速修改表的一列值
  6. 1535C. Unstable String
  7. element ui中dialog相关问题
  8. 正则表达式 使用分支
  9. java.sql.SQLException: Io 异常: The Network Adapter could not establish the connection 解决
  10. mysql执行程序_Sql在Mysql的执行
  11. Nginx配置多域名代理
  12. Win10 通过注册表修改默认应用
  13. 0929【非常好】 库仑计计算电量 Fuel Gauge 锂离子电池及电池电量计介绍
  14. AD9361射频捷变收发器系列对比
  15. 三种分布式爬虫系统的架构方式
  16. socket 服务器端和客户端通信,面向TCP的
  17. i58300h和i7 8750h哪个好 i58300h和i7 8750h对比差距大吗
  18. 谈一谈百度 科大讯飞 云知声的语音合成功能
  19. 中班机器人教室设计方案_中班美术教案机器人
  20. 老干妈怒了:我才是中国第一!

热门文章

  1. 使用Python在Excel中嵌入附件(txt文件,zip压缩包)对象
  2. 计算机开机怎样进入cmos,在电脑启动过程中进入CMOS
  3. css如何让不自动换行,css实现强制不换行/自动换行/强制换行
  4. 木马核心技术剖析读书笔记之木马驱动加载与启动
  5. cmwap和cmnet的网速
  6. 二月主题读书整理——元技能系列
  7. c语言求平均数double,编写程序以计算浮点值的平均值
  8. 新浪微博的双城记:孤独与喧嚣
  9. IM通讯协议总结之三SIMPLE协议
  10. 单元测试工具之Mockito