仅显示 Swift/SwiftUI 中 Date 对象的时间
Displaying only time from a Date object in Swift/SwiftUI
我一直在努力显示带有结束时间的音频持续时间。一位优秀的 Stack Overflow 开发人员建议了这个解决方案。
因此,我在我的观点中添加了这个:
struct ContentView: View {
@ObservedObject var viewModel = MyViewModel() //<- here
var body: some View {
VStack {
Text(viewModel.endTime) //<- here
}
}
}
这是我的代码 viewModel
:
class MyViewModel: ObservableObject {
@Published var endDate: Date?
var endTime: String{
endDate == nil ? "":endDate!.description
}
func play(){
let path = Bundle.main.path(forResource: "song", ofType:"mp3")!
let url = URL(fileURLWithPath: path)
do {
player = try AVAudioPlayer(contentsOf: url)
endDate = Date() + player.duration
if player.isPlaying{
player.pause()
}
else{
player.play()
}
isPlaying = player.isPlaying
}catch{print("error")}
但是我得到了错误的时间(不是系统时间)但是日期是正确的。我只想显示没有日期的正确时间。
要显示格式化日期,您可能需要使用 DateFormatter
:
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .none
let date = Date(timeIntervalSinceReferenceDate: 118800)
// US English Locale (en_US)
dateFormatter.locale = Locale(identifier: "en_US")
print(dateFormatter.string(from: date)) // Jan 2, 2001
来源:https://developer.apple.com/documentation/foundation/dateformatter
(请注意,众所周知,创建 DateFormatter
是一项昂贵的操作,因此请注意不要过于频繁地创建它们)
您的视图模型中也存在一些逻辑错误。以下是如何处理此问题的示例:
struct ContentView : View {
@ObservedObject private var vm = MyViewModel()
var body: some View {
Button(action:{
vm.play()
} ) {
Text(vm.isPlaying ? "Stop" : "Play")
}
Text(vm.endTime)
}
}
class MyViewModel: ObservableObject {
@Published var endDate: Date?
@Published var isPlaying = false
var player = AVAudioPlayer()
var dateFormatter = DateFormatter()
var endTime: String{
guard let endDate = endDate else {
return ""
}
dateFormatter.dateStyle = .none
dateFormatter.timeStyle = .medium
return dateFormatter.string(from: endDate)
}
func play(){
do{
if player.isPlaying {
player.pause()
} else {
let path = Bundle.main.path(forResource: "All Of Me Final Mix", ofType:"mp3")!
let url = URL(fileURLWithPath: path)
player = try AVAudioPlayer(contentsOf: url)
endDate = Date() + player.duration - player.currentTime
player.play()
}
isPlaying = player.isPlaying
} catch {
print("error: \(error)")
}
}
}
自 iOS 14+ 起,Text 具有用于显示日期的 属性 命名样式。
Text.DateStyle
A predefined style used to display a Date.
init(Date, style: Text.DateStyle)
Creates an instance that displays localized dates and times using a specific style. https://developer.apple.com
您不需要使用 DateFormatter
。使用 Text()
和 time
作为样式就足够了,可能。
Text(Date(), style: .time)
你的情况:
Text(viewModel.endTime, style: .time)
我一直在努力显示带有结束时间的音频持续时间。一位优秀的 Stack Overflow 开发人员建议了这个解决方案。
因此,我在我的观点中添加了这个:
struct ContentView: View {
@ObservedObject var viewModel = MyViewModel() //<- here
var body: some View {
VStack {
Text(viewModel.endTime) //<- here
}
}
}
这是我的代码 viewModel
:
class MyViewModel: ObservableObject {
@Published var endDate: Date?
var endTime: String{
endDate == nil ? "":endDate!.description
}
func play(){
let path = Bundle.main.path(forResource: "song", ofType:"mp3")!
let url = URL(fileURLWithPath: path)
do {
player = try AVAudioPlayer(contentsOf: url)
endDate = Date() + player.duration
if player.isPlaying{
player.pause()
}
else{
player.play()
}
isPlaying = player.isPlaying
}catch{print("error")}
但是我得到了错误的时间(不是系统时间)但是日期是正确的。我只想显示没有日期的正确时间。
要显示格式化日期,您可能需要使用 DateFormatter
:
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .none
let date = Date(timeIntervalSinceReferenceDate: 118800)
// US English Locale (en_US)
dateFormatter.locale = Locale(identifier: "en_US")
print(dateFormatter.string(from: date)) // Jan 2, 2001
来源:https://developer.apple.com/documentation/foundation/dateformatter
(请注意,众所周知,创建 DateFormatter
是一项昂贵的操作,因此请注意不要过于频繁地创建它们)
您的视图模型中也存在一些逻辑错误。以下是如何处理此问题的示例:
struct ContentView : View {
@ObservedObject private var vm = MyViewModel()
var body: some View {
Button(action:{
vm.play()
} ) {
Text(vm.isPlaying ? "Stop" : "Play")
}
Text(vm.endTime)
}
}
class MyViewModel: ObservableObject {
@Published var endDate: Date?
@Published var isPlaying = false
var player = AVAudioPlayer()
var dateFormatter = DateFormatter()
var endTime: String{
guard let endDate = endDate else {
return ""
}
dateFormatter.dateStyle = .none
dateFormatter.timeStyle = .medium
return dateFormatter.string(from: endDate)
}
func play(){
do{
if player.isPlaying {
player.pause()
} else {
let path = Bundle.main.path(forResource: "All Of Me Final Mix", ofType:"mp3")!
let url = URL(fileURLWithPath: path)
player = try AVAudioPlayer(contentsOf: url)
endDate = Date() + player.duration - player.currentTime
player.play()
}
isPlaying = player.isPlaying
} catch {
print("error: \(error)")
}
}
}
自 iOS 14+ 起,Text 具有用于显示日期的 属性 命名样式。
Text.DateStyle
A predefined style used to display a Date.
init(Date, style: Text.DateStyle)
Creates an instance that displays localized dates and times using a specific style. https://developer.apple.com
您不需要使用 DateFormatter
。使用 Text()
和 time
作为样式就足够了,可能。
Text(Date(), style: .time)
你的情况:
Text(viewModel.endTime, style: .time)