Unity 之 切换语言导致报错:System.FormatException:String was not recognized as a valid DateTime.
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.相关推荐
- SAP COR2下达工单,报错 System status APNG is active 之对策
SAP COR2下达工单,报错 System status APNG is active 之对策 笔者发现,在项目上的SAP系统上使用事务代码COR2去release某个工单,得到如下报错信息: 这种 ...
- mtk一键usb驱动_三菱MRJEB驱动器报错,导致报错原因37.1参数设置范围异常?
三菱MR-JE-B驱动器报错,导致报错原因37.1参数设置范围异常?最近海蓝机电工程师们在做一个项目,做的是三菱MR-JE-B驱动器.工程师们在实操这个项目过程中遇到各种问题,其中就像驱动器报错的问题 ...
- win10添加计算机语言,Win10添加语言包报错“0x800F0950”怎么办?
Win10添加语言包报错"0x800F0950"怎么办?在使用Win10系统的过程中,有时候我们需要添加语言,来实现一些工作需求,然而有用户遇到添加语言包失败的情况,系统提示错误代 ...
- python操作html的object_关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题...
有的bug,莫名其妙就好了- python3.9 报错 "AttributeError: 'HTMLParser' object has no attribute 'unescape'&qu ...
- 报错System.ComponentModel.Win32Exception:“系统找不到指定的文件。”
问题: 使用C#语言在Visual Studio2019中运用RichTextBox控件添加超链接,运行程序点击超链接报错System.ComponentModel.Win32Exception:&q ...
- 安卓没删干净导致报错
安卓没删干净导致报错,要到放安卓文件的位置去删!!! 转载于:https://www.cnblogs.com/yuanyifei/p/4154888.html
- 二级c语言程序设计翻译,C语言程序设计报错英文翻译
C语言程序设计报错英文翻译 C++出错提示英汉对照表 来源: 杨赫的日志 Ambiguous operators need parentheses -----------不明确的运算需要用括号括起- ...
- SylixOS移植常见问题——编译过多文件导致报错
问题复现: 由于RealEvo IDE在Windows下使用的sh.exe支持的命令长度有限(命令要小于16K),如果需要编译的源文件过多,可能会报溢出错误或"make (e=87): 参数 ...
- Git 无法切换分支,报错git did not exit cleanly
Git 无法切换分支,报错git did not exit cleanly 今天从做内存泄漏测试需要切换Git分支,checkout 的时候发现报错git did not exit cleanly. ...
最新文章
- java 实例化 bean,Spring(02)——bean实例化
- 网上搜集第三方(一)
- 我的MAXSCRIPT笔记
- python练习--模拟grep -B功能
- sqlserver 如何把一列分为一行显示_SqlServer数据库如何快速修改表的一列值
- 1535C. Unstable String
- element ui中dialog相关问题
- 正则表达式 使用分支
- java.sql.SQLException: Io 异常: The Network Adapter could not establish the connection 解决
- mysql执行程序_Sql在Mysql的执行
- Nginx配置多域名代理
- Win10 通过注册表修改默认应用
- 0929【非常好】 库仑计计算电量 Fuel Gauge 锂离子电池及电池电量计介绍
- AD9361射频捷变收发器系列对比
- 三种分布式爬虫系统的架构方式
- socket 服务器端和客户端通信,面向TCP的
- i58300h和i7 8750h哪个好 i58300h和i7 8750h对比差距大吗
- 谈一谈百度 科大讯飞 云知声的语音合成功能
- 中班机器人教室设计方案_中班美术教案机器人
- 老干妈怒了:我才是中国第一!