Javascript 如何使用Ramda求解小时格式?

Javascript 如何使用Ramda求解小时格式?,javascript,functional-programming,ramda.js,Javascript,Functional Programming,Ramda.js,我是函数式编程的新手,在学习了函数式编程和Ramda的基础知识之后,我决定通过替换以前使用命令式编程编写的一些函数来解决问题。我决定重写函数来执行一个简单的任务 将13:22转换为下午1:22 这是我经过深思熟虑后写的代码 const formatHr = (R.cond([ [R.lt(R.__,13), R.identity], [R.gte(R.__,13), R.subtract(R.__,12)], ])); const updateHr = x => { cons

我是函数式编程的新手,在学习了函数式编程和Ramda的基础知识之后,我决定通过替换以前使用命令式编程编写的一些函数来解决问题。我决定重写函数来执行一个简单的任务

13:22转换为下午1:22

这是我经过深思熟虑后写的代码

const formatHr = (R.cond([
  [R.lt(R.__,13), R.identity],
  [R.gte(R.__,13), R.subtract(R.__,12)],
]));

const updateHr = x => {
  const hr = parseInt(R.head(x));
  const newHr = formatHr(hr);
  const newX = R.update(0, newHr, x);
  const meridiem = R.ifElse(R.lt(R.__,12),x => R.identity('AM'), x => R.identity('PM'))(hr);
  return `${R.join(':',newX)} ${meridiem}`
}

const getHour = R.pipe(R.split(':'), updateHr);
const hr = getHour('13:22'); // 1:22 PM

它似乎太复杂了,无法用ES6语法轻松地用普通javascript编写。有人能告诉我它是如何高效地完成的吗?

虽然我们肯定可以用Ramda工具改进它,但似乎没有什么理由这样做。我认为你的目标有点误导。Ramda(免责声明:我是其作者之一)旨在为您提供帮助您以某种方式编写代码的工具。它不是一种新的JS方言,您应该将所有代码转换成它

我会这样写这个函数:

const formatHour=(时间)=>{
常数[h,m]=时间分割(':')
返回`${h>12?h-12:h}:${m}${h>=12?'PM':'AM'}`
}

log(formatHour('13:22'))
虽然我们肯定可以使用Ramda工具在这方面进行改进,但似乎没有什么理由这样做。我认为你的目标有点误导。Ramda(免责声明:我是其作者之一)旨在为您提供帮助您以某种方式编写代码的工具。它不是一种新的JS方言,您应该将所有代码转换成它

我会这样写这个函数:

const formatHour=(时间)=>{
常数[h,m]=时间分割(':')
返回`${h>12?h-12:h}:${m}${h>=12?'PM':'AM'}`
}

log(formatHour('13:22'))
我会在拆分后使用R.applySpec,因为每个映射函数都可以访问所有原始值

我不会将Ramda用于映射函数(
normalizeHour
amPm
),因为分解结构和文字模板更易于使用,也更易于阅读

格式化值后,使用R.props获取它们(R.values也可以,但不太明确),然后连接这些值

const{pipe,split,applySpec,props,join}=R
常量normalizeHour=([m])=>m>12?m-12:m
常量amPm=([h,m])=>`${m}${h>=12&&h<24?'PM':'AM'}`
const formatHour=管道(
拆分(“:”),
applySpec({
h:我的小时,
m:amPm,
}),
道具(['h','m']),
加入(“”)
);
console.log(
['7:04','11:59','12:01','13:22','24:53']
)

我会在拆分后使用R.applySpec,因为每个映射函数都可以访问所有原始值

我不会将Ramda用于映射函数(
normalizeHour
amPm
),因为分解结构和文字模板更易于使用,也更易于阅读

格式化值后,使用R.props获取它们(R.values也可以,但不太明确),然后连接这些值

const{pipe,split,applySpec,props,join}=R
常量normalizeHour=([m])=>m>12?m-12:m
常量amPm=([h,m])=>`${m}${h>=12&&h<24?'PM':'AM'}`
const formatHour=管道(
拆分(“:”),
applySpec({
h:我的小时,
m:amPm,
}),
道具(['h','m']),
加入(“”)
);
console.log(
['7:04','11:59','12:01','13:22','24:53']
)

午夜00:00和24:00

在24小时计时法中,一天从午夜00:00开始,一天的最后一分钟从23:59开始。在方便的情况下,符号24:00也可用于表示给定日期结束时的午夜[5]——即,一天的24:00与第二天的00:00相同

24:00符号主要用于表示时间间隔内一天的确切结束时间。一个典型的用法是给出以午夜结束的营业时间(例如“00:00–24:00”、“07:00–24:00”)。同样,一些公共汽车和火车时刻表显示00:00为出发时间,24:00为到达时间。法律合同通常从00:00的开始日期开始运行,直到24:00的结束日期

虽然24小时表示法明确区分了任何给定日期开始(00:00)和结束(24:00)的午夜,但12小时表示法的用户之间没有公认的区别。一些英语国家的风格指南和军事通信法规不鼓励使用24:00,即使是在24小时记分法中,也不鼓励使用24:00,建议报告时间改为午夜23:59或00:01。[6]有时也避免使用00:00。[6]与此不同,美国海军和美国海军陆战队通信手册先前规定0001至2400。[7]该手册于2015年6月更新,使用0000至2359

24:00后的次数

24:00以后的时间标记(例如24:0125:00而不是00:0101:00)不常用,也不在相关标准的涵盖范围内。然而,在英国、法国、西班牙、加拿大、日本、韩国、香港和中国的一些特殊情况下,它们偶尔被使用,其中营业时间超过午夜,例如广播电视生产和调度。 (引文:)


我们的节目

这里的其他答案讨论了我们在选择以不同方式表达我们的程序时所做的一些权衡。在这个回答中,我特别想重点介绍如何实现一个健壮的格式化程序,该格式化程序可以适应上面概述的各种变化。我们将编写
format24
,它需要一个24小时的时间字符串和一个格式化函数,并希望它能像这样工作-

format24(“00:00”,to12)/=>“12:00am”
格式24(“11:59”,至12)/=>“上午11:59”
格式24(“12:01”,至12)/=>“12:01下午”
格式24(“13:22”,至12)/=>“下午1:22”
格式24(“24:00”,至12)//