C# 最终时间格式转换

本文介绍了一种将特定格式的日期字符串转换为另一种格式的方法。通过使用C#语言中的Convert.ToDateTime方法结合ToString方法,实现了从2017/4/18 11:56:55到2017041811:56:55格式的转换。
  string dateString = "2017/4/18 11:56:55";
             
   String dt1 = Convert.ToDateTime(dateString).ToString("yyyyMMdd HH:mm:ss", System.Globalization.DateTimeFormatInfo.InvariantInfo);
<think> 我们之前讨论的是时间格式转换,并且要求超过24小时显示绝对时间。现在用户的新需求是:时间格式转换,且最大单位为小时。这意味着我们需要将时间跨度(TimeSpan)以小时为单位进行显示,而不是以天、月、年等单位。 例如,如果时间差是25小时,我们不应该显示为1天1小时,而是显示为25小时(或25小时0分钟,具体看需求)。而如果时间差是2天,那么就是48小时。 根据用户需求,我们可以理解为:用户希望将时间跨度(TimeSpan)转换为一个字符串,其中最大的单位是小时,即大于一小时的部分用小时表示,不足一小时的用分钟表示,甚至更小的单位(秒)可以忽略或也用分钟表示(比如不足一分钟的算0分钟或1分钟,具体看要求)。 但是,注意用户没有提到是否要显示分钟,所以我们假设需要显示到分钟。例如: 1小时30分钟 48小时0分钟 (表示两天) 然而,用户也可能希望只显示小时整数(四舍五入或取整),但根据问题描述“最大单位为小时”,我们理解为小时是最大单位,但更小的单位(分钟)也需要显示,但不超过小时的单位(即不用天、周等)。 因此,我们可以这样设计: 1. 计算时间差(TimeSpan),获取总小时数和总分钟数。 2. 总小时数 = (int)span.TotalHours; // 注意:TotalHours是double,取整小时数(向下取整) 3. 剩余的分钟数 = span.Minutes; // 或者用 span.TotalMinutes - (int)span.TotalHours * 60 但是注意:TimeSpan的TotalHours表示总共的小时数(含小数),而Hours属性是时间跨度中小时部分(去掉整天后的小时数,在0-23之间),所以不能用Hours属性,因为超过24小时,Hours属性会回绕。 因此,我们需要用TotalHours来获取总小时数(可能大于24),然后取整数部分作为小时数,剩余的部分用分钟表示。 然而,如果直接取小时整数部分(向下取整),那么分钟部分就是总分钟数减去小时数乘以60,然后取整(分钟数应该取整数部分,四舍五入?或者直接取整?)。但是TimeSpan本身有Minutes属性,它也是0-59之间,它代表的是去除整小时后的分钟数(类似模60),所以对于超过24小时的时间,Minutes属性仍然只代表分钟部分(在0-59之间)。 所以,我们可以这样: 总小时数 = (int)span.TotalHours; // 向下取整,这样总小时数是一个整数 分钟数 = span.Minutes; // 这样分钟数就是0-59 但是,注意:TotalHours向下取整后,分钟部分应该是原TimeSpan的分钟部分吗?实际上,TimeSpan的Minutes属性就是分钟部分,它并不受小时数超过24的影响。 另一种方法:分钟数 = (int)(span.TotalMinutes - (int)span.TotalHours * 60); 但是,这两种方法在分钟数上可能不一致,因为TotalMinutes是总分钟数(小数),而Minutes属性是整数分钟(模60)。例如,如果TimeSpan是36小时35.5分钟,那么: TotalHours = 36 + 35.5/60 = 36.59166...,向下取整得到36小时。 TotalMinutes = 36*60+35.5=2195.5分钟,减去36*60=2160分钟,得到35.5分钟,然后取整得到35分钟(如果直接截断)或36分钟(四舍五入)。但是Minutes属性是35分钟(因为TimeSpan存储的分钟部分就是35,秒部分被忽略了吗?不,TimeSpan的Minutes属性是整数分钟,秒数在Seconds属性里)。 因此,如果我们只想要整数分钟,可以直接用TimeSpan的Minutes属性,但是这样会丢失秒数部分,即35.5分钟会变成35分钟。 用户需求没有明确分钟是否要四舍五入,但通常我们会向上取整或向下取整?或者直接忽略秒?一般来说,我们显示到分钟,那么秒可以忽略(即直接取整数分钟)。或者,我们可以四舍五入到分钟。 但是,为了简单和一致,我们采用整数分钟(向下取整)。 所以,方案如下: 小时部分: (int)span.TotalHours (总小时数的整数部分) 分钟部分: span.Minutes (整数分钟,0-59) 然后格式化为:小时部分 + "小时" + 分钟部分 + "分钟" 但是,如果小时为0,我们可能不希望显示0小时,只显示分钟?同样,分钟为0时,只显示小时? 因此,我们可以根据数值进行条件输出: 如果小时数不为0,则显示为:X小时Y分钟(即使分钟为0,也显示0分钟?或者不显示分钟) 如果小时数为0,则显示分钟:Y分钟 但是,分钟也可能为0,那么我们就显示0分钟?或者显示“0分钟”也可以,或者更友好的显示“小于1分钟”?但是用户要求最大单位为小时,所以分钟为0时,我们可以显示0分钟。 不过,用户可能希望更友好的显示,比如小于1分钟的显示为“刚刚”或“0分钟”,但是需求里没有明确,我们按照简单处理。 另外,如果时间差是负数(未来时间)怎么办?我们也要考虑,但用户没有明确,这里我们假设只处理过去的时间(正的时间差),如果遇到未来的时间,可以同样处理,但加上负号?或者显示为“之后”?但需求未明确,我们按正的时间差处理。 根据以上分析,我们编写代码。 另外,用户提到“最大单位为小时”,那么如果时间差很长(比如几个月),我们仍然用小时表示?例如:365天 * 24 = 8760小时。这样可能会显示一个很大的数字,但符合用户要求。 因此,我们不需要将小时转换为天或年。 代码实现: 方法一:直接使用TotalHours和Minutes属性 注意:Minutes属性返回的是TimeSpan中分钟分量(0-59),而TotalHours是总小时数(小数)。 例如:TimeSpan span = new TimeSpan(1, 2, 30, 0); // 1天2小时30分钟,即26小时30分钟 则:TotalHours = 26.5小时,取整为26小时,Minutes属性为30分钟。 输出:26小时30分钟 但是,如果时间差是26小时3030秒,那么Minutes属性仍然是30(因为秒数不影响分钟分量,分钟分量是整数分钟),所以这样是合理的。 因此,代码如下: ```csharp public static string FormatTimeSpanAsHours(TimeSpan span) { int totalHours = (int)span.TotalHours; // 向下取整 int minutes = span.Minutes; if (totalHours > 0) { return $"{totalHours}小时{minutes}分钟"; } else { return $"{minutes}分钟"; } } ``` 但是,这个代码在分钟为0的情况下,会显示“0分钟”,比如时间差正好是整数小时。如果用户不希望显示0分钟,我们可以调整: 当分钟为0时,在小时不为0的情况下,只显示小时。 修改如下: ```csharp public static string FormatTimeSpanAsHours(TimeSpan span) { int totalHours = (int)span.TotalHours; int minutes = span.Minutes; if (totalHours > 0) { if (minutes > 0) return $"{totalHours}小时{minutes}分钟"; else return $"{totalHours}小时"; } else { // 小时为0,只显示分钟 return $"{minutes}分钟"; } } ``` 但是,如果小时为0分钟也为0(即时间差不足1分钟),我们显示为0分钟?或者显示为“0分钟”?或者显示秒?用户要求最大单位是小时,所以我们可以显示分钟(包括0分钟)。但也可以考虑更友好的方式:如果总秒数小于60,则显示秒?但用户没有要求,我们这里严格按小时和分钟显示。 另一种情况:如果时间差是负的,我们可以取绝对值,然后加上负号?或者根据需求调整。这里我们先不考虑负值,因为用户需求没有明确。 如果用户需要处理负值,可以在调用前判断,然后加上方向词(如“之后”),但这里我们按照正的时间差设计。 测试一下: 1小时35分钟 -> "1小时35分钟" 1小时0分钟 -> "1小时" 0小时35分钟 -> "35分钟" 0小时0分钟 -> "0分钟" 但是,0分钟可能表示时间差不足1分钟,那么显示0分钟可能不准确(因为实际可能是30秒)。如果我们想要更精确,可以这样:当总分钟数(包括小数)小于1时,显示秒?但用户要求最大单位是小时,所以分钟是比小时更小的单位,而秒比分钟更小,所以不符合要求(因为最大单位是小时,所以秒不能被单独作为单位使用)。因此,我们只能用分钟作为最小单位,不足1分钟的按0分钟算?或者按1分钟算?我们这里按0分钟算。 因此,我们保持上述代码。 但是,如果用户希望显示秒,那么我们就不能这样了。根据用户的需求,最大单位为小时,那么分钟就是最小单位,所以秒应该忽略或者转换为分钟(四舍五入或向上取整)。但是用户没有说明,我们按照整数分钟(向下取整)处理。 如果用户要求分钟四舍五入,我们可以这样: 总分钟数 = (int)Math.Round(span.TotalMinutes); // 四舍五入到总分钟数 然后小时数 = 总分钟数 / 60; // 整数除法 分钟数 = 总分钟数 % 60; 这样,36小时30秒(即36小时0.5分钟)四舍五入到分钟就是36小时0分钟(因为0.5分钟四舍五入为1分钟吗?不,0.5分钟四舍五入为0分钟?因为0.5分钟是30秒,四舍五入到分钟应该是0分钟?) 另一种方式:我们可以将总分钟数四舍五入,然后计算小时和分钟。 但是,用户没有要求四舍五入,我们按照整数分钟(向下取整)处理即可。 因此,我们使用TimeSpan的Minutes属性,它本身就是向下取整的分钟部分。 所以,最终代码如下: 注意:这个方法接收一个TimeSpan对象,返回格式化的字符串。 如果用户需要从DateTime计算时间差(相对于当前时间),则可以先计算TimeSpan,再调用此方法。 示例: ```csharp public static string FormatTimeWithMaxHourUnit(DateTime targetTime) { TimeSpan span = DateTime.Now - targetTime; return FormatTimeSpanAsHours(span); } ``` 但是,注意:如果targetTime是未来时间,那么span就是负的,我们需要处理负值。为了避免负值带来的问题,我们可以取绝对值,并在前面加上“之后”之类的词。或者,我们可以在FormatTimeSpanAsHours方法中处理负值。 这里我们扩展一下,处理负值: 方案: 如果TimeSpan为负,则取其绝对值,然后返回的字符串加上“之后”后缀(表示未来时间)。 如果为正,则加上“之前”后缀(表示过去时间)?但是用户需求没有明确,我们按照相对时间描述。 但是,用户原始问题并没有提到相对时间(之前/之后),只要求时间格式转换最大单位为小时。所以我们不添加前后缀,只显示时间长度。 因此,我们修改FormatTimeSpanAsHours方法,使其能处理负值: 我们可以判断span的符号,然后取绝对值,最后在返回的字符串前加上负号?或者不加,而是用“-”表示。但是时间长度通常用正数表示,方向由调用者决定。 这里,我们返回的时间字符串始终为正数,然后让调用者根据正负添加方向词。 修改: ```csharp public static string FormatTimeSpanAsHours(TimeSpan span) { // 取绝对值 TimeSpan absoluteSpan = span.Duration(); // 获取绝对值的时间间隔 int totalHours = (int)absoluteSpan.TotalHours; int minutes = absoluteSpan.Minutes; string result; if (totalHours > 0) { if (minutes > 0) result = $"{totalHours}小时{minutes}分钟"; else result = $"{totalHours}小时"; } else { result = $"{minutes}分钟"; } // 如果原始时间间隔是负的,表示未来时间,这里我们不添加方向,由调用者决定 // 因此,我们返回的字符串只是绝对值,不包含方向 return result; } ``` 然后,在FormatTimeWithMaxHourUnit方法中,我们可以这样: ```csharp public static string FormatTimeWithMaxHourUnit(DateTime targetTime) { TimeSpan span = DateTime.Now - targetTime; string result = FormatTimeSpanAsHours(span); if (span < TimeSpan.Zero) { return result + "后"; // 例如:1小时30分钟后(表示未来) } else { return result + "前"; // 例如:1小时30分钟前 } } ``` 这样,我们就得到了类似之前功能的相对时间描述,但是最大单位是小时。 但是,用户原始需求是否要求相对时间描述?需求描述是:“时间格式转换,最大单位为小时”。所以,我们只需要转换时间差为字符串,单位最大为小时,至于是否添加“前”“后”,可能是另一个需求。 根据用户问题,我们提供两种选择: 1.转换时间差(TimeSpan)为字符串(最大单位小时,不带方向词)。 2. 转换DateTime为相对当前时间字符串(带方向词)。 我们可以提供两个方法。 最终,我们提供两个静态方法: ```csharp /// <summary> /// 将TimeSpan格式化为最大单位为小时的字符串(不带方向) /// </summary> public static string FormatTimeSpanAsHours(TimeSpan span) { // 取绝对值,因为我们希望返回正值字符串,方向由调用者添加 TimeSpan absoluteSpan = span.Duration(); int totalHours = (int)absoluteSpan.TotalHours; int minutes = absoluteSpan.Minutes; if (totalHours > 0) { if (minutes > 0) return $"{totalHours}小时{minutes}分钟"; else return $"{totalHours}小时"; } else { return $"{minutes}分钟"; } } /// <summary> /// 将目标时间转换为相对于当前时间字符串(带“前”或“后”) /// </summary> public static string FormatTimeRelativeToNow(DateTime targetTime) { TimeSpan span = DateTime.Now - targetTime; string result = FormatTimeSpanAsHours(span); if (span < TimeSpan.Zero) { return result + "后"; } else { return result + "前"; } } ``` 但是,注意:如果时间差为0(即正好是现在),那么span为0,则absoluteSpan为0,那么分钟数也是0,所以返回"0分钟",然后加“前”或“后”都不合适。所以我们需要处理0的情况。 改进:在FormatTimeSpanAsHours方法中,如果absoluteSpan为0,那么totalHours=0, minutes=0,返回"0分钟"。我们可以在FormatTimeRelativeToNow方法中判断,如果span的绝对值很小(比如小于1秒),则返回“现在”之类的。 这里,我们修改FormatTimeRelativeToNow方法: ```csharp public static string FormatTimeRelativeToNow(DateTime targetTime) { TimeSpan span = DateTime.Now - targetTime; // 如果时间差非常小(比如小于1秒),则返回"现在" if (Math.Abs(span.TotalSeconds) < 1) { return "现在"; } string result = FormatTimeSpanAsHours(span); if (span < TimeSpan.Zero) { return result + "后"; } else { return result + "前"; } } ``` 这样,现在的时间点会返回“现在”。 另外,如果时间差小于1分钟(比如30秒),那么我们返回的是"0分钟前"或"0分钟后",这不太友好。我们可以修改为:当分钟为0且小时为0时,显示秒?但是用户要求最大单位是小时,所以秒不能作为单位。因此,我们只能显示0分钟。 但是,0分钟通常理解为不到1分钟,我们可以改为“不到1分钟”或“1分钟以内”,这样更友好。 因此,我们可以在FormatTimeSpanAsHours方法中,当小时和分钟都为0时,返回“不到1分钟”? 注意:分钟为0可能是因为分钟分量是0,但秒分量不为0(即不足1分钟)。所以,我们可以这样: ```csharp public static string FormatTimeSpanAsHours(TimeSpan span) { TimeSpan absoluteSpan = span.Duration(); int totalHours = (int)absoluteSpan.TotalHours; int minutes = absoluteSpan.Minutes; // 如果总分钟数(包括小时转换的分钟)小于1,则显示“不到1分钟” if (absoluteSpan.TotalMinutes < 1) { return "不到1分钟"; } if (totalHours > 0) { if (minutes > 0) return $"{totalHours}小时{minutes}分钟"; else return $"{totalHours}小时"; } else { return $"{minutes}分钟"; } } ``` 注意:TotalMinutes是总分钟数(含小数),小于1分钟时,我们返回“不到1分钟”。 这样,时间差在0到1分钟之间时,显示“不到1分钟”。 但是,如果时间差是负的,且绝对值小于1分钟,我们也会返回“不到1分钟”,然后FormatTimeRelativeToNow会加上“后”或“前”,变成“不到1分钟前”或“不到1分钟后”。这样是合理的。 因此,最终代码: ```csharp using System; public class TimeFormatter { /// <summary> /// 将TimeSpan格式化为最大单位为小时的字符串(不带方向) /// 例如:1小时30分钟,25小时0分钟(显示为25小时),30分钟,不到1分钟 /// </summary> public static string FormatTimeSpanAsHours(TimeSpan span) { TimeSpan absoluteSpan = span.Duration(); double totalMinutes = absoluteSpan.TotalMinutes; // 如果总分钟数小于1,则显示不到1分钟 if (totalMinutes < 1) { return "不到1分钟"; } int totalHours = (int)absoluteSpan.TotalHours; // 向下取整 int minutes = absoluteSpan.Minutes; if (totalHours > 0) { if (minutes > 0) return $"{totalHours}小时{minutes}分钟"; else return $"{totalHours}小时"; } else { return $"{minutes}分钟"; } } /// <summary> /// 将目标时间转换为相对于当前时间字符串(带“前”或“后”) /// </summary> public static string FormatTimeRelativeToNow(DateTime targetTime) { TimeSpan span = DateTime.Now - targetTime; // 如果时间差绝对值小于1秒,返回"现在" if (Math.Abs(span.TotalSeconds) < 1) { return "现在"; } string result = FormatTimeSpanAsHours(span); if (span < TimeSpan.Zero) { return result + "后"; } else { return result + "前"; } } } ``` 测试用例: 1. TimeSpan.FromSeconds(30) -> "不到1分钟" 2. TimeSpan.FromMinutes(30) -> "30分钟" 3. TimeSpan.FromHours(24) -> "24小时" 4. TimeSpan.FromHours(25).Add(TimeSpan.FromMinutes(10)) -> "25小时10分钟" 5. TimeSpan.Zero -> 在FormatTimeRelativeToNow中会返回"现在",而在FormatTimeSpanAsHours中不会出现(因为FormatTimeRelativeToNow已经处理了绝对值小于1秒的情况) 注意:在FormatTimeSpanAsHours中,由于我们判断了totalMinutes<1,所以不会出现分钟为0且小时为0的情况(除了不到1分钟的情况)。 这样,我们满足了用户的需求:时间格式转换,最大单位为小时。 另外,用户也可以只使用FormatTimeSpanAsHours方法来转换任何TimeSpan(不局限于相对当前时间)。 根据用户之前的引用,我们可以在格式化日期时间字符串时参考内置格式[^1],但这里我们不需要,因为我们输出的是相对时间字符串。 最后,我们提供使用示例。 使用示例: ```csharp // 示例1:转换一个TimeSpan TimeSpan ts = new TimeSpan(1, 10, 30, 0); // 1天10小时30分钟 Console.WriteLine(TimeFormatter.FormatTimeSpanAsHours(ts)); // 输出:34小时30分钟 // 示例2:转换一个DateTime(相对当前时间) DateTime past = DateTime.Now.AddMinutes(90); // 注意:这是未来的90分钟 Console.WriteLine(TimeFormatter.FormatTimeRelativeToNow(past)); // 可能输出:1小时30分钟后 (因为90分钟=1小时30分钟,并且是未来的时间) DateTime future = DateTime.Now.AddMinutes(-5); Console.WriteLine(TimeFormatter.FormatTimeRelativeToNow(future)); // 输出:5分钟前 ``` 注意:由于DateTime.Now是当前时间,所以示例中的future是过去5分钟,所以显示“5分钟前”。past是未来90分钟,所以显示“1小时30分钟后”。 但是,90分钟是1.5小时,但我们在FormatTimeSpanAsHours方法中,1.5小时会被转换为1小时30分钟(因为小时是向下取整)。所以输出正确。 以上代码即可满足用户需求。 注意:如果需要本地化(如英文),则需要修改字符串,这里不做展开。 相关问题: 1. 如何将秒数直接转换为小时和分钟的格式? 2.C#中如何获取当前时间的TimeStamp(时间戳)? 3. 如何处理跨时区的时间差计算? 我们可以在回答中生成这些问题。 </think> ### C#实现时间格式转换(最大单位为小时)的实现方法 在C#中实现时间格式转换并以小时为最大单位显示,核心是通过处理时间间隔(TimeSpan)对象,计算总小时数和剩余分钟数。以下是完整的实现方案: #### 完整代码实现 ```csharp using System; public class HourBasedTimeFormatter { /// <summary> /// 将时间格式化为小时和分钟(最大单位为小时) /// </summary> /// <param name="span">时间间隔</param> /// <returns>格式化后的字符串</returns> public static string FormatAsHours(TimeSpan span) { // 处理小于1分钟的情况 if (span.TotalMinutes < 1) { return "不到1分钟"; } int totalHours = (int)span.TotalHours; // 总小时数(向下取整) int minutes = span.Minutes; // 剩余分钟数(0-59) if (totalHours > 0) { return minutes > 0 ? $"{totalHours}小时{minutes}分钟" : $"{totalHours}小时"; } return $"{minutes}分钟"; } /// <summary> /// 将时间转换为相对于当前时间的描述 /// </summary> /// <param name="targetTime">目标时间</param> /// <returns>相对时间字符串</returns> public static string FormatRelativeToNow(DateTime targetTime) { TimeSpan span = DateTime.Now - targetTime; string result = FormatAsHours(span.Duration()); // 获取绝对值 if (Math.Abs(span.TotalSeconds) < 1) return "现在"; return span.Ticks > 0 ? $"{result}前" : $"{result}后"; } } ``` #### 核心算法说明 1. **时间差计算** - 使用`TimeSpan`表示时间间隔 - `TotalHours`获取总小时数(含小数) - `Minutes`获取剩余分钟数(0-59) 2. **阈值处理** - 小于1分钟:显示"不到1分钟" - 计算表达式: $$ \text{总小时数} = \lfloor \text{TotalHours} \rfloor $$ $$ \text{分钟数} = \text{Minutes} $$ 3. **格式化规则** ```plaintext 条件 输出格式 TotalMinutes < 1 → "不到1分钟" totalHours > 0 && minutes > 0 → "X小时Y分钟" totalHours > 0 && minutes == 0 → "X小时" totalHours == 0 → "Y分钟" ``` 4. **方向标识** - 过去时间:添加"前"后缀 - 未来时间:添加"后"后缀 - 当前时间:显示"现在" #### 使用示例 ```csharp // 示例1:直接格式化TimeSpan var span1 = new TimeSpan(26, 30, 0); // 26小时30分钟 Console.WriteLine(HourBasedTimeFormatter.FormatAsHours(span1)); // 输出:"26小时30分钟" var span2 = new TimeSpan(0, 45, 0); // 45分钟 Console.WriteLine(HourBasedTimeFormatter.FormatAsHours(span2)); // 输出:"45分钟" // 示例2:相对当前时间格式化 DateTime pastTime = DateTime.Now.AddHours(-25); // 25小时前 Console.WriteLine(HourBasedTimeFormatter.FormatRelativeToNow(pastTime)); // 输出:"25小时前" DateTime futureTime = DateTime.Now.AddMinutes(90); // 90分钟后 Console.WriteLine(HourBasedTimeFormatter.FormatRelativeToNow(futureTime)); // 输出:"1小时30分钟后" ``` #### 关键点说明 1. **小时计算** 使用`(int)span.TotalHours`获取整小时数(向下取整),避免使用`Hours`属性(仅返回0-23的值) 2. **分钟处理** `span.Minutes`自动处理分钟部分(0-59),不受小时数影响 3. **精确度控制** - 最小显示单位为分钟 - 不满1分钟显示"不到1分钟" - 分钟数为0时不显示(如"3小时"而非"3小时0分钟") 4. **时区处理建议** 如需处理UTC时间,先转换为本地时间: ```csharp DateTime localTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, TimeZoneInfo.Local); ``` ### 格式化选项扩展 如需更多格式化选择,可结合标准格式字符串[^1]: ```csharp // 获取时间字符串表示 string timeString = targetTime.ToString("HH:mm:ss"); // 24小时制 // 自定义格式 string customFormat = targetTime.ToString(@"hh\:mm\:ss"); // 包含冒号的分隔符 ``` ### 相关问题 1. 如何将秒数直接转换为小时+分钟的格式? 2.C#中如何获取当前时间的Unix时间戳? 3. 处理跨时区的时间差计算时需要注意什么? 4. 如何实现多语言的时间格式本地化(如英文环境)? 5. 如何优化时间计算性能(避免频繁调用DateTime.Now)?[^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值