java怎么把毫秒转换成天数_关于java:如何将毫秒转换为“ hh:mm:ss”格式?
我糊涂了。 绊倒这个线程后,我试图找出如何格式化具有hh:mm:ss格式的倒数计时器。
这是我的尝试-
//hh:mm:ss
String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) -
TimeUnit.MINUTES.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
因此,当我尝试3600000ms之类的值时,我得到01:59:00,这是错误的,因为它应该是01:00:00。 显然我的逻辑有问题,但是目前,我看不出它是什么!
有人可以帮忙吗?
编辑-
固定它。 这是将毫秒格式设置为hh:mm:ss格式的正确方法-
//hh:mm:ss
String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) -
TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))));
问题是此TimeUnit.MINUTES.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))。 应该是这个TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))。
3,600,000毫秒是3,600秒或60分钟或1小时。 它不应该是00:59:59,应该是01:00:00。
你真的很亲密:
String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) -
TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)), // The change is in this line
TimeUnit.MILLISECONDS.toSeconds(millis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
您使用分钟而不是小时将小时转换为毫秒。
顺便说一句,我喜欢您使用TimeUnit API :)
这是一些测试代码:
public static void main(String[] args) throws ParseException {
long millis = 3600000;
String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
System.out.println(hms);
}
输出:
01:00:00
我意识到上面的代码可以通过使用模数除法而不是减法来大大简化:
String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) % TimeUnit.HOURS.toMinutes(1),
TimeUnit.MILLISECONDS.toSeconds(millis) % TimeUnit.MINUTES.toSeconds(1));
仍对所有魔术值使用TimeUnit API,并提供完全相同的输出。
阿们,就像您使用TimeUnit API的方式一样:)
重新发明轮子不是一个好主意!特里顿·芒斯的答案是更好的解决方案。
@ ???????????但是另一个答案是使用外部库,而我的代码仅使用核心JDK。这取决于您的需求-例如,您可能无法使用外部库。另一个答案是好的。
超过365天时如何回合?你能做相当于几年的时间吗?谢谢。
@KarenAnne是什么意思?你能给我示例输入和输出吗?
@ ???????????我需要在字符串中添加Days和其他文本。在这个答案中,很容易我在%02d和finish之间插入了文本,那么用您建议的答案比这个更好呢?
给定时间(以毫秒为单位),例如时间不超过一个小时,则返回例如" 00:15:23"。有什么方法可以使它在为空时删除零?例如,返回" 15:23"而不是" 00:15:23"。
@Ozuf添加.replaceAll("^00:","")或.replaceAll("^00:(00:)?","")以删除分钟和小时(如果两者均为零)。
谢谢,但是如果时间是" 00:15:00"或" 10:00:23"会怎样?
@Ozuf分别得到"15:00"和"10:00:23";由于^将匹配锚定为输入的开始,因此仅删除了前导零。
谢谢一百万:D。请您更新答案,以便其他人可以轻松看到它吗?
int hrs =(int)TimeUnit.MILLISECONDS.toHours(miliSeconds)%24; int min =(int)TimeUnit.MILLISECONDS.toMinutes(miliSeconds)%60; int sec =(int)TimeUnit.MILLISECONDS.toSeconds(miliSeconds)%60;返回String.format("%02d:%02d:%02d",小时,分钟,秒);
节省了很多时间。谢谢。
通用方法非常简单:
public static String convertSecondsToHMmSs(long seconds) {
long s = seconds % 60;
long m = (seconds / 60) % 60;
long h = (seconds / (60 * 60)) % 24;
return String.format("%d:%02d:%02d", h,m,s);
}
字符串是String.format("%d:%02d:%02d", h,m,s)。
@ Javaman59,您是说String.format("% 02 d:%02d:%02d", h,m,s)吗?
@KarenAnne。这取决于您是否要使用例如" 03:59:59"或" 3:59:59"。
时间(以毫秒为单位),您需要将秒数乘以1000
作者问的是毫秒,而不是秒!
如果您使用的是Apache Commons:
DurationFormatUtils.formatDuration(timeInMS,"HH:mm:ss,SSS");
快捷方式:DurationFormatUtils.formatDurationHMS(timeInMS);
@Jorgesys为什么它们已过时?
他们没有过时。
// New date object from millis
Date date = new Date(millis);
// formattter
SimpleDateFormat formatter= new SimpleDateFormat("HH:mm:ss.SSS");
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
// Pass date object
String formatted = formatter.format(date );
请参见使用1200 ms输入的可运行示例。
超过一天的时间将产生错误的结果。它将把小时数从23换回0,这在这里可能是不希望的。
没有朋友...我认为它仍然可以正常工作。尝试今天的日期
SimpleDateFormat sdf = new SimpleDateFormat(" hh:mm aa");如果有人想要12小时制的上午/下午
我用这个:
String.format("%1$tH:%1$tM:%1$tS.%1$tL", millis);
请参阅类格式化程序的描述。
请参见使用2400 ms输入的可运行示例。
似乎不起作用,我只是通过100、1000、1200进行了测试,它的响应时间是05:30:00,05:30:01、05:30:01。
@CoDe,它适用于您的时区。您所处的时区必须与UTC不同。 String.format()与时区有关。但是,理想的正确答案应该与时区无关。
@CoDe,它显示的时间与您的时区相对应,必须与UTC不同。 String.format()与时区有关。但是,理想的正确答案应该与时区无关。
DateFormat df = new SimpleDateFormat("HH:mm:ss");
String formatted = df.format(aDateObject);
答案与stackoverflow.com/questions/9027317/相同,持续时间超过1天的问题相同
它也取决于时区,这意味着在不同时区运行时结果将有所不同。
4种实现的测试结果
必须对海量数据进行大量格式化,需要最佳性能,因此(令人惊讶的)结果如下:
对于(int i = 0; i <1000000; i ++){
FUNCTION_CALL
}
持续时间:
组合格式:196毫秒
格式持续时间:272毫秒
apache格式:754毫秒
formatTimeUnit:2216毫秒
public static String apacheFormat(long millis) throws ParseException {
return DurationFormatUtils.formatDuration(millis,"HH:mm:ss");
}
public static String formatTimeUnit(long millis) throws ParseException {
String formatted = String.format(
"%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis)
- TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis)
- TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
return formatted;
}
public static String formatDuration(final long millis) {
long seconds = (millis / 1000) % 60;
long minutes = (millis / (1000 * 60)) % 60;
long hours = millis / (1000 * 60 * 60);
StringBuilder b = new StringBuilder();
b.append(hours == 0 ?"00" : hours < 10 ? String.valueOf("0" + hours) :
String.valueOf(hours));
b.append(":");
b.append(minutes == 0 ?"00" : minutes < 10 ? String.valueOf("0" + minutes) :
String.valueOf(minutes));
b.append(":");
b.append(seconds == 0 ?"00" : seconds < 10 ? String.valueOf("0" + seconds) :
String.valueOf(seconds));
return b.toString();
}
public static String combinationFormatter(final long millis) {
long seconds = TimeUnit.MILLISECONDS.toSeconds(millis)
- TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis));
long minutes = TimeUnit.MILLISECONDS.toMinutes(millis)
- TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis));
long hours = TimeUnit.MILLISECONDS.toHours(millis);
StringBuilder b = new StringBuilder();
b.append(hours == 0 ?"00" : hours < 10 ? String.valueOf("0" + hours) :
String.valueOf(hours));
b.append(":");
b.append(minutes == 0 ?"00" : minutes < 10 ? String.valueOf("0" + minutes) :
String.valueOf(minutes));
b.append(":");
b.append(seconds == 0 ?"00" : seconds < 10 ? String.valueOf("0" + seconds) :
String.valueOf(seconds));
return b.toString();
}
这些指标的可靠性如何?我从来没有真正了解过这个过程。
在连续创建数千个对象的情况下,我认为此测试非常有用。可以不仅设置一些字符串,还可以创建具有一个字段的格式化字符串的对象。
@marius麻烦您使用StringBuilder,然后犯了使用" 0" +数字类型的"废墟"的错误。 @mre JVMs GC非常擅长分配和收集大量的短期对象,而无需担心。我使用String.format没有前导零逻辑来处理。
按照波西米亚的答案,我们不需要使用TimeUnit来查找已知值。
更好的代码将是
String hms = String.format("%02d:%02d:%02d", millisLeft/(3600*1000),
millisLeft/(60*1000) % 60,
millisLeft/1000 % 60);
希望能帮助到你
最喜欢您的答案! 只是简单的数学。 顺便说一句,在我的情况下,我将毫秒数添加到了millisLeft%100010的末尾,因此我们得到的格式为hour:minutes:seconds:milliseconds
public String millsToDateFormat(long mills) {
Date date = new Date(mills);
DateFormat formatter = new SimpleDateFormat("HH:mm:ss");
String dateFormatted = formatter.format(date);
return dateFormatted; //note that it will give you the time in GMT+0
}
答案取决于时区,这意味着在不同时区运行时结果会有所不同。
下面的代码以两种方式进行转换
23:59:58:999至86398999
然后
86398999至23:59:58:999
import java.util.concurrent.TimeUnit;
public class TimeUtility {
public static void main(String[] args) {
long currentDateTime = System.currentTimeMillis();
String strTest ="23:59:58:999";
System.out.println(strTest);
long l = strToMilli(strTest);
System.out.println(l);
l += 1;
String str = milliToString(l);
System.out.println(str);
}
/**
* convert a time string into the equivalent long milliseconds
*
* @param strTime string fomratted as HH:MM:SS:MSMS i.e."23:59:59:999"
* @return long integer like 86399999
*/
public static long strToMilli(String strTime) {
long retVal = 0;
String hour = strTime.substring(0, 2);
String min = strTime.substring(3, 5);
String sec = strTime.substring(6, 8);
String milli = strTime.substring(9, 12);
int h = Integer.parseInt(hour);
int m = Integer.parseInt(min);
int s = Integer.parseInt(sec);
int ms = Integer.parseInt(milli);
String strDebug = String.format("%02d:%02d:%02d:%03d", h, m, s, ms);
//System.out.println(strDebug);
long lH = h * 60 * 60 * 1000;
long lM = m * 60 * 1000;
long lS = s * 1000;
retVal = lH + lM + lS + ms;
return retVal;
}
/**
* convert time in milliseconds to the corresponding string, in case of day
* rollover start from scratch 23:59:59:999 + 1 = 00:00:00:000
*
* @param millis the number of milliseconds corresponding to tim i.e.
* 34137999 that can be obtained as follows;
*
* long lH = h * 60 * 60 * 1000; //hour to milli
*
* long lM = m * 60 * 1000; // minute to milli
*
* long lS = s * 1000; //seconds to milli
*
* millis = lH + lM + lS + ms;
* @return a string formatted as HH:MM:SS:MSMS i.e."23:59:59:999"
*/
private static String milliToString(long millis) {
long hrs = TimeUnit.MILLISECONDS.toHours(millis) % 24;
long min = TimeUnit.MILLISECONDS.toMinutes(millis) % 60;
long sec = TimeUnit.MILLISECONDS.toSeconds(millis) % 60;
//millis = millis - (hrs * 60 * 60 * 1000); //alternative way
//millis = millis - (min * 60 * 1000);
//millis = millis - (sec * 1000);
//long mls = millis ;
long mls = millis % 1000;
String toRet = String.format("%02d:%02d:%02d:%03d", hrs, min, sec, mls);
//System.out.println(toRet);
return toRet;
}
}
我赞成这个解决方案。只需在秒和毫升之间插入一个点。而且我不知道为什么在Java中很难处理时间和日期。最常用的功能应该已经可用,并且是该类的一部分。
String string = String.format("%02d:%02d:%02d.%03d",
TimeUnit.MILLISECONDS.toHours(millisecend), TimeUnit.MILLISECONDS.toMinutes(millisecend) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millisecend)),
TimeUnit.MILLISECONDS.toSeconds(millisecend) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisecend)), millisecend - TimeUnit.SECONDS.toMillis(TimeUnit.MILLISECONDS.toSeconds(millisecend)));
格式:00:00:00.000
示例:615605 Millisecend
00:10:15.605
标记为正确的答案有一点错误,
String myTime = String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) -
TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)), // The change is in this line
TimeUnit.MILLISECONDS.toSeconds(millis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
例如,这是我得到的价值的一个例子:
417474:44:19
这是获得正确格式的解决方案:
String myTime = String.format("%02d:%02d:%02d",
//Hours
TimeUnit.MILLISECONDS.toHours(millis) -
TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS.toDays(millis)),
//Minutes
TimeUnit.MILLISECONDS.toMinutes(millis) -
TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
//Seconds
TimeUnit.MILLISECONDS.toSeconds(millis) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
结果得到正确的格式:
18:44:19
获取格式hh:mm:ss的其他选项就是:
Date myDate = new Date(timeinMillis);
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
String myTime = formatter.format(myDate);
这与Kotlin一起为我工作
fun formatToDigitalClock(miliSeconds: Long): String {
val hours = TimeUnit.MILLISECONDS.toHours(miliSeconds).toInt() % 24
val minutes = TimeUnit.MILLISECONDS.toMinutes(miliSeconds).toInt() % 60
val seconds = TimeUnit.MILLISECONDS.toSeconds(miliSeconds).toInt() % 60
return when {
hours > 0 -> String.format("%d:%02d:%02d", hours, minutes, seconds)
minutes > 0 -> String.format("%02d:%02d", minutes, seconds)
seconds > 0 -> String.format("00:%02d", seconds)
else -> {
"00:00"
}
}
}
为我完美地工作。 这应该是最好的答案,因为它可以处理零小时
我尝试了如第一个答案所示。它有效,但是减号使我感到困惑。我对Groovy的回答:
import static java.util.concurrent.TimeUnit.*
...
private static String formatElapsedTime(long millis) {
int hrs = MILLISECONDS.toHours(millis) % 24
int min = MILLISECONDS.toMinutes(millis) % 60
int sec = MILLISECONDS.toSeconds(millis) % 60
int mls = millis % 1000
sprintf( '%02d:%02d:%02d (%03d)', [hrs, min, sec, mls])
}
Java 9
Duration timeLeft = Duration.ofMillis(3600000);
String hhmmss = String.format("%02d:%02d:%02d",
timeLeft.toHours(), timeLeft.toMinutesPart(), timeLeft.toSecondsPart());
System.out.println(hhmmss);
打印:
01:00:00
您让库方法为您完成涉及的转换是对的。 java.time,现代的Java日期和时间API,或更准确地说,它的Duration类比TimeUnit更优雅,更不容易出错。
我使用的toMinutesPart和toSecondsPart方法是在Java 9中引入的。
Java 6、7和8
long hours = timeLeft.toHours();
timeLeft = timeLeft.minusHours(hours);
long minutes = timeLeft.toMinutes();
timeLeft = timeLeft.minusMinutes(minutes);
long seconds = timeLeft.toSeconds();
String hhmmss = String.format("%02d:%02d:%02d", hours, minutes, seconds);
System.out.println(hhmmss);
输出与上面相同。
问题:在Java 6和7中如何工作?
在Java 8和更高版本以及更新的Android设备上(告诉我来自API级别26),java.time是内置的。
在Java 6和7中,获取ThreeTen Backport,这是现代类的backport(JSR 310的ThreeTen;请参见底部的链接)。
在较旧的Android上,请使用Android版本的ThreeTen Backport。叫做ThreeTenABP。并确保使用子包从org.threeten.bp导入日期和时间类。
链接
Oracle教程:日期时间,说明如何使用java.time。
Java Specification Request(JSR)310,其中首先描述了java.time。
ThreeTen Backport项目,java.time到Java 6和7的反向端口(JSR-310的ThreeTen)。
ThreeTenABP,ThreeTen Backport的Android版
问题:如何在Android Project中使用ThreeTenABP,并有非常详尽的说明。
对于科特林
val hours = String.format("%02d", TimeUnit.MILLISECONDS.toHours(milSecs))
val minutes = String.format("%02d",
TimeUnit.MILLISECONDS.toMinutes(milSecs) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milSecs)))
val seconds = String.format("%02d",
TimeUnit.MILLISECONDS.toSeconds(milSecs) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milSecs)))
其中,milSecs是毫秒
好吧,您可以尝试这样的事情:
public String getElapsedTimeHoursMinutesSecondsString() {
long elapsedTime = getElapsedTime();
String format = String.format("%%0%dd", 2);
elapsedTime = elapsedTime / 1000;
String seconds = String.format(format, elapsedTime % 60);
String minutes = String.format(format, (elapsedTime % 3600) / 60);
String hours = String.format(format, elapsedTime / 3600);
String time = hours +":" + minutes +":" + seconds;
return time;
}
将毫秒转换为时间值
java怎么把毫秒转换成天数_关于java:如何将毫秒转换为“ hh:mm:ss”格式?相关推荐
- 时间戳转换成YY-MM-DD HH:MM:SS格式
时间戳转换成YY-MM-DD HH:MM:SS格式 formatDate (timeStamp) {// console.log('时间戳',timeStamp)timeStamp=`${timeSt ...
- 格式化时间 将2021-09-05T09:08:03.000Z 转换成 YYYY-MM-DD HH:mm:ss 格式
格式化时间 将2021-09-05T09:08:03.000Z 转换成 YYYY-MM-DD HH:mm:ss 格式 1.引入第三方包 dayjs (一个轻量的处理时间和日期的javascript库) ...
- java 获取当前时间并转化为yyyy-MM-dd HH:mm:ss格式(性程安全模式与不安全)
https://blog.csdn.net/weixin_39973810/article/details/82012329方法一(线程不安全, 不建议使用)private SimpleDateFor ...
- java怎么把毫秒转换成天数_Java 毫秒转换为日期类型、日期转换为毫秒
//毫秒转换为日期 public static void main(String[] args) { DateFormat formatter = new SimpleDateFormat(" ...
- jquery 毫秒转换成日期_基于jQuery的时间戳与日期间的转化
本文实例为大家分享了jQuery时间戳与日期间的转化代码,供大家参考,具体内容如下 背景: 需求如图: 直接上代码,所有的内容都在注释里: /** * 格式化时间:补0操作 * */ function ...
- 在vue中将2022-07-05T09:57:39.000Z 转换成 YYYY-MM-DD HH:mm:ss 格式
1.问题描述 今天联系项目的时候遇到一个时间格式的问题,在数据库的时候时间格式是正常的,但是前端页面拿的数据渲染表格的时候就显示不是我想要的格式了,这就需要对时间格式进行处理了 下面两张图就是数据库和 ...
- java 获取当前hhmm_java 获取当前时间并转化为yyyy-MM-dd HH:mm:ss格式
https://blog.csdn.net/weixin_39973810/article/details/82012329 方法一(线程不安全, 不建议使用) private SimpleDateF ...
- 电子表格转换成数据库_创建数据库,将电子表格转换为关系数据库,第1部分...
电子表格转换成数据库 Part 1: Creating an Entity Relational Diagram (ERD) 第1部分:创建实体关系图(ERD) A Relational Databa ...
- python将音频转换成文字_用Python将音频内容转换为文本格式,方言可以吗?
当对一个或多个人的谈话进行记录时,采用一种高度准确和自动化的方式将口语提取为文本非常有用.转换成文字后,便可以将其用于进一步分析或用作其他功能. 在本教程中,我们将使用称为AssemblyAI(htt ...
最新文章
- 什么是野指针和内存泄露?如何避免野指针
- 很好的 .NET 换肤软件 IrisSkin
- tensorflow计算网络占用内存_详细图解神经网络梯度下降法(tensorflow计算梯度)...
- 消息已读未读的模型设计_阿里云技术专家分享:现代 IM 系统中消息推送和存储架构的实现...
- 【jquery Ajax 练习】图书管理
- 隐马尔科夫模型(HMM)模型训练:Baum-Welch算法
- Java练习、每日一题、共100题
- Redis Guava 布隆过滤器实现和准确率测试
- 【公式编辑测试】解析几何-三角形外心重心垂心内心公式
- 君子生非异也,善假于物也。【借助外力获取能量,主动改善生存环境。】
- selenium用jquery改变元素属性
- 安徽大学计算机保研学校,她手握6所名校offer,19岁从安徽大学保研到北大,网友却说她亏了...
- 三种查看MySQL数据库版本的方法
- Splunk机器学习应用(Machine Learning Toolkit)
- jquery学习2_jquery知识预览
- mysql drop后回收站怎么恢复_回收站清空了怎么恢复
- 如何快速给pdf加水印?
- windows show failed无法启动你的相机
- 一个小软件公司的催款书
- Bugfree 客户端使用手册
热门文章
- 16进制在c语言中用来做什么,十六进制在代码中有什么用
- html标签的pre语义,HTML pre 标签
- html css图片展开动画,8个实用炫酷的HTML5图片动画应用
- flutter 刷脸_支付宝刷脸认证 - osc_bkdv2it5的个人空间 - OSCHINA - 中文开源技术交流社区...
- 2021庐江高考成绩查询,2021庐江高考考点查询入口https://lj.hfzsks.org/list_score/index.php?seach_t...
- Laravel短信mysql_使用 Laravel 实现阿里云短信服务队列
- Ubuntu 16.04 安装Go 1.9.2
- java开发C语言编译器
- 161011、oracle批量插入数据
- GitHub中watch star fork三个按钮干什么用的?